在测试特定功能时,是否有任何理由使用多个验证语句 - 即验证是否调用了多个/或没有依赖方法?
例如:
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();
}
拥有第二个验证语句是否有价值,还是没有必要,因为如果第一个语句没有被调用,第二个语句也没有被调用?
您应该验证 2 个语句,因为您的代码可能会更改。
单元测试是代码的某种文档。
- 验证这两个语句
- 意味着不得调用这两个语句。
- 仅验证一个意味着只能调用第一个语句。
如果有人更改了在 if
语句中调用 anotherService.someMethod()
的方法,您的测试仍将以 1 次验证通过,并在 2 次验证时失败。
你担心你的测试一次应该只测试一个"概念"是正确的,并且这是一个判断什么构成"太多"测试的问题。您的原始示例是一个很好的示例:
@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 年后,实习生可能会更新代码,并且需要删除正在检查的一个任务。您的测试仍将通过(删除的代码未执行 - 检查!),但这并不意味着代码行为正确。