代码之家  ›  专栏  ›  技术社区  ›  lhumongous

单元测试中的C++与依赖注入

  •  5
  • lhumongous  · 技术社区  · 16 年前

    假设我有一个C++类,像这样:

    class A
    {
        public:
            A()
            {
    
            }
    
            void SetNewB( const B& _b ) { m_B = _b; }
    
        private:
            B m_B;
    }
    

    为了进行这样的单元测试,我必须打破A对B的依赖。由于类A保留在实际对象上而不是指针上,所以我必须重构此代码以获取指针。另外,我需要为B创建一个父接口类,这样我可以在测试setnewb时传入自己的伪B。

    在这种情况下,使用依赖注入的单元测试是否会进一步使现有代码复杂化?如果我将b设置为指针,那么现在我将引入堆分配,并且一些代码现在负责清理它(除非我使用引用计数指针)。另外,如果B是一个非常普通的类,只有几个成员变量和函数,为什么要为它引入一个全新的接口,而不只是用B的一个实例进行测试呢?

    我想您可以通过使用接口使重构变得更容易的论点成为可能。但是,在某些情况下,两个类可能需要紧密耦合吗?

    3 回复  |  直到 16 年前
        1
  •  9
  •   miked    16 年前

    我认为你对单元测试的想法做得太过火了。在这种情况下,A和B是一个单元,也就是说,没有B,A是不可能存在的。首先,测试B并确保它通过了所有B特定的单元测试,然后一旦通过,测试A并确保它的行为是应该的。

        2
  •  2
  •   Philippe Beaudoin    16 年前

    如果 B 是一种依赖注入 A 然后你应该考虑一些其他的选择。首先是注射 乙 施工时:

    class A
    {
        public:
            A( const B& _b ) : m_B(_b) {}
    
        private:
            const B& m_B;
    };
    

    如果你真的想修改 B 在您的生命周期中 一 对象,然后问问自己你是否真的是 乙 . 如果没有,则向它传递一个指针,并假定传递它的人负责它的生命周期——不过这是一个棘手的路由,可能需要使用引用计数指针。

    如果你想做的是为自己取一份B的副本,那么你可以定义一个 clone() 方法对 乙 . 如果要使用中包含的信息创建自己的对象, B 然后你可以注射 MyBFactory 在构造函数中,并与此一起使用 乙 .

        3
  •  0
  •   tloach    16 年前

    根据您使用b的方式,您可能可以使用std::auto_ptr而不是引用计数指针。只要您不需要将对B的引用传递给其他可以工作并且只需要最少的代码更改的对象。