在单元测试中使用多个验证语句是否有价值



在测试特定功能时,是否有任何理由使用多个验证语句 - 即验证是否调用了多个/或没有依赖方法?

例如:

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 年后,实习生可能会更新代码,并且需要删除正在检查的一个任务。您的测试仍将通过(删除的代码未执行 - 检查!),但这并不意味着代码行为正确。

相关内容

  • 没有找到相关文章