如何在进行单元测试时模拟内部对象?

时间:2013-02-28 11:49:41

标签: unit-testing

我有一个这样的课:

Class A 
{
   public boolean do(String s)
   {
        C c = DB.GetResult(s);
        ....
        return yes/no
   }
}

我想如何使用Mockito编写单元测试,但如何模拟内部对象C以禁止数据库连接操作。

1 个答案:

答案 0 :(得分:0)

你的意思是模拟内部对象DB而不是C吗?

在你喜欢的代码中你不能。你必须将DB注入到A类中。然后在单元测试中注入mock / stub而不是与数据库对话的对象。

编辑: 你可以这样做(我正在使用C#):

Class A 
{
   private readonly IDb database;

   // you can inject by hand or using IoC container
   // if you don't like that you have to pass IDb implementation everywhere
   // where you create objects of type A you can add another constructor - look under
   public A(IDb database)
   {
       this.database = database;
   }

   // here you call the above constructor and pass you original DB object
   public A() : this(new DB())
   {
   }

   public boolean do(String s)
   {
        C c = database.GetResult(s);
        ....
        return yes/no
   }
}

当然,您的DB类必须实现IDb接口。

interface IDb
{
    C GetResults(String s);
}

现在你在测试中这样做:

var a = new A(new TestDBDoingReturningExactlyWhatYouTellItToReturn());

并在应用程序代码中:

var a = new A(new DB());

或无参数构造函数,它完全执行上面的行

var a = new A();