我有一个void函数,它不返回任何带有if块的东西。是否有一种方法,而单元测试来验证是否"如果"块被触摸?
以为例来测试下面函数中的"if":
public void doSomething(){
if(someCondition){
int foo = doThis();
}
// ----
// remaining code
}
private int doThis(){
return 100;
}
如果您的方法返回void,这意味着它可能做的唯一工作就是产生副作用。这才是你真正想要测试的。
- 设置外部状态
- 运行正在测试的方法
- 你检查状态改变,因为你期望它改变。
为测试方法内的每个执行路径准备外部状态,这将涵盖代码的所有可能结果。
在做UnitTest时,你想测试可观察的行为,而不是代码。
可观察的行为是:
- (公共)接口方法返回值
- 与其他对象(依赖)的交互
- 对象状态的变化(通常是getter结果的变化)
通过被测类(CUT)的公共接口进行测试。这些公共接口不一定是指公共方法,而是指代码使用CUT调用的方法。
在您的情况下,您希望在调用方法时测试对象的状态变化作为副作用。
但是问题是你的代码没有改变对象的状态,所以什么都不能测试。
从技术上讲,你可以提高getter方法的可见性,并用Mockito模拟它,但这和整个代码一样没用。
修订
我写这些是因为OP有任务要做。我要强调的是,这是而不是。
因为要观察的方法是私有的,所以你有两个选项:
使要观察的方法对测试类可见。然后你可以使用普通的Mockito功能:
/*ClassUnderTest CUT */public void doSomething(){如果(someCondition) {int foo = doThis();}//----//剩余代码}/*包私有,测试类应该在同一个包*/int这么做(){返回100;}/* TestClass */@TestdoSomething__conditionTrue__callesMemberMethod(){ClassUnderTest cut = Mockito。间谍(新ClassUnderTest ());//使条件为真所需的任何东西cut.doSomething ();Mockito.verify(削减).doThis ();}@TestdoSomething__conditionFalse__doesNotCallMemberMethod(){ClassUnderTest cut = Mockito。间谍(新ClassUnderTest ());//使条件为假所需的任何东西cut.doSomething ();Mockito.verify(切,从不()).doThis ();}
使用PowerMock (ito)
但是PowerMockito改变了CUT的字节码,因此你并没有真正测试你的CUT。我强烈建议不要使用它,除非你必须测试遗留代码,否则无法测试。