在单元测试中有多个验证声明是否有价值?

时间:2017-01-19 16:42:58

标签: java junit mockito

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

例如:

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();
  }

拥有第二个验证声明是否有价值或者是否没有必要,因为如果第一个声明没有被调用,那么第二个声明也不是吗?

3 个答案:

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