在测试特定功能时是否有任何理由要有多个验证声明 - 即。验证是否调用了多个/或没有依赖方法?
例如:
public void doSomething(int size){
if(size < 50){
return;
}
someService.someMethod();
anotherService.someMethod();
}
测试此方法
@Test
public void testDoSomethingWithSmallSize() throws Exception{
testObj.doSomething(5);
verify(someServiceMock, never()).someMethod();
//IS THERE ANY VALUE TO VERFIYING MORE THAN ONE CALL?
//LIKE THIS??
verfiy(anotherServiceMock, never()).someMethod();
}
拥有第二个验证声明是否有价值或者是否没有必要,因为如果第一个声明没有被调用,那么第二个声明也不是吗?
答案 0 :(得分:1)
您应该验证2个语句,因为您的代码可以更改。
单元测试是代码的某种文档。
如果有人更改了方法以在anotherService.someMethod()
语句中调用if
,那么您的测试仍会通过1次验证,并且会在2次验证时失败。
答案 1 :(得分:1)
你担心你的测试只应该测试一个&#34;概念&#34;在一个时间,并且这是一个关于什么构成测试的判断问题&#34;太多&#34;。你原来的例子很好:
@Test
public void testDoSomethingWithSmallSize() throws Exception{
testObj.doSomething(5);
verify(someServiceMock, never()).someMethod();
verify(anotherServiceMock, never()).someMethod();
// GOOD: You've called one method-under-test and
// verified two related postconditions. A perfect, small, clear test.
}
但这太容易了。
@Test
public void testDoSomethingWithAnySmallSize() throws Exception{
testObj.doSomething(1);
testObj.doSomething(3);
testObj.doSomething(5);
verify(someServiceMock, never()).someMethod();
verify(anotherServiceMock, never()).someMethod();
// LESS GOOD: You've called one method-under-test three times, but
// they share postconditions and concepts. Pragmatic, but not the
// "one test method for one test case" ideal of most frameworks.
}
@Test
public void thisShouldBeThreeTests() throws Exception{
testObj.doSomething(7);
verify(someServiceMock).doAThing(7);
verify(anotherService).doAThing(700);
testObj.doSomethingElse(9);
verify(someServiceMock).doAThing(9);
verify(anotherService).doAThing(900);
testObj.doAThirdThing(12);
verify(someServiceMock).doAThing(12);
verify(anotherService).doAThing(1200);
// BAD: Even though these are related, this could easily be three
// unrelated tests for better naming and reporting, and to help you
// identify why one case might be failing versus three. Break this up.
}
所以是的,不要害怕在同一个测试中有多个verify
,但要注意不要让你的verify
陈述偏离不相关,特别是如果您使用Mockito的reset
方法重置测试设置,请小心。
答案 2 :(得分:0)
YES!单元测试的部分功能是记录代码的预期行为。测试应以将待测代码视为黑盒的方式编写。如果被测代码将按特定顺序执行两项操作(如果满足条件),则单元测试应检查所有事情是否在正条件下完成,且没有项目是在负面条件下完成的。
如果您只检查测试中的一个条件,那么从现在起2年后,实习生可能会更新代码,并需要删除正在检查的一个任务。您的测试仍将通过(代码已删除但未执行 - 请检查!)但这并不意味着代码行为正常。