![](/img/trans.png)
[英]when testing a class, check the work inside the method using a Junit and a Mockito
[英]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.