繁体   English   中英

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

[英]Mockito JUnit testing: check method call in constructor

我有一个带有私有和公共或受保护方法的Foo类。 例如:

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测试此类。

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 ...框架。 他们依靠字节码操作; 迟早会带来麻烦。 相信我,我花了很多时间来寻找无缘无故的奇怪错误。

然后:不要以这种方式测试您的代码!

您使用模拟框架来创建/控制传递给“被测类”的那些对象。 您不使用该框架直接测试“被测类”!

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

您要做的是:

a)如前所述,您可以使用模拟将对象传递到要测试的类中。 然后,您可以控制/验证那些模拟,以查看您希望“测试中的类”进行的调用

b)创建“被测类”的对象……然后在那些对象的属性上“断言”; 或方法调用返回的结果。

只是要准确:一个嘲笑的对象......不知道在“原始”类的代码什么 这是一个模拟 您不能将其用于您的问题暗示您想要做的那种测试。 您可以在真实的类中调用方法; 或者您为模拟指定内容。 但是创建一个模拟然后将其“关联”到具体的类实现上……是完全不可能的。

最后:如果您认为您的具体类实际上“太大”而不能以正常的测试方式创建……那么机会就在于:您的类对于其他任何事情都太大了。 班级应小; 并且其设计应遵循SOLID原则。

长话短说:不要通过使用PowerMock来将无法测试的代码强加到“测试”中。您最好花更多的时间来提高生产代码的质量。 这将导致更高的“投资回报率”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM