Mockito JUnit 测试:检查构造函数中的方法调用

Mockito JUnit testing: check method call in constructor

我有一个 class Foo 具有私有和 public 或受保护的方法。例如:

public class Foo{

   private int number;
   public Foo(){
      setup();
      doSthing();
   }

   private void doSthing(){
      number=10;
   }

   public void setup(){
   }

   protected int getNumber(){
      return number;
   }

   public void run(){
      getNumber();
      //Do blah blah...
    }    
}

我正在尝试使用 Mockito 测试这个 class。

public class FooTest
{
   public void testMethods()
   {
      Foo foo = PowerMockito.mock (Foo.class);

      //1 What should I do to see that setup() and doSthing()
      //has been called on Foo construction

      mock.run();
      //2 What should I do to see that getNumber()
      //has been called on run() method call
   }
}

如果可能的话,我也希望包括 "times(1)"。非常感谢你的帮助。

你弄错了:

首先:请不要使用任何 PowerMock... 框架。他们依赖于字节码操作;这迟早会带来麻烦。相信我,我花了很多时间寻找非常奇怪的错误,但没有充分的理由。

然后:不要这样测试你的代码!

您使用模拟框架 create/control 您 传递 给 "class under test" 的那些对象。你不使用框架直接测试你的"class under test"!

您也不想编写了解 私有 方法的测试代码 - 这些是实现细节。

你做了什么:

a) 如前所述,您可以使用模拟将对象传递到您的 class 被测对象中。然后你可以 control/verify 那些模拟看到你希望 "class under test" 进行的调用

b) 您创建 "class under test" 的对象...然后 "assert" 这些对象的属性;或方法调用 return.

的结果

准确地说:一个模拟对象...对 "original" class 中的代码一无所知。这是一个mock!您不能将它用于您的问题暗示您想做的那种测试。要么你在你的真实 class 上调用方法;或者您为模拟指定一些东西。但是创建一个模拟然后 "associate" 它到具体的 class 实现......根本不可能。

最后:如果您认为您的具体 class 实际上是 "too big" 只是以正常的测试方式创建...那么很可能:您的 class 只是 太大了 其他任何东西。 类应该小;他们的设计应该遵循 SOLID 原则。

长话短说:不要试图通过使用 PowerMock 将不可测试的代码强加到 "tests" 中......您最好投入更多时间来提高生产代码的质量;这将导致更高的 "return on investment"。