Mockito,方法验证的使命

时间:2017-08-25 06:34:14

标签: java mockito verify

你能解释一下mockito方法验证的任务吗?文档说,这个方法检查方法是否被调用。但是,当它真的有用时,你能给出一个例子吗?通常在测试方法中我们调用一个方法然后...检查,我们现在调用它?听起来很奇怪。

6 个答案:

答案 0 :(得分:3)

它是这样的:

public class UnderTest {
  private Foo foo;

  public UnderTest(Foo foo) { this.foo = foo };

  public void bar() { foo.foo(); }
}

现在假设您向UnderTest提供模拟的 foo实例。并且您希望确定在调用foo.foo()时调用bar()

然后使用 verify()确保预期的调用发生。

换句话说:测试需要验证方法行为。理想情况下,他们通过断言对被测方法返回的值进行操作。但并非所有方法都能归还。然后,可能验证您的代码,至少检查对所测试的类所拥有/传递的对象的某些预期调用是否确实发生了。然后你需要 verify()

答案 1 :(得分:2)

这种类型的检查通常只是为了确保使用指定的参数使用特定对象。让我们假设您正在测试执行某些操作的业务服务,并且在此过程中还会在DB中存储某种审计跟踪。

在DB中存储这种信息已在其他地方进行了测试(使用了单独的单元测试或某种外部库),因此您无需检查审计数据是否已正确存储。为了您的测试用例,调用此方法的信息就足够了。这就是'验证'的用例。方法

答案 2 :(得分:2)

  

通常在测试方法中我们调用一个方法然后...检查,我们现在调用了它?听起来很奇怪。

您没有验证是否调用了测试方法。您验证了由于该测试所做的任何事情,调用了一些依赖(您已经用模拟替换)。

因此,例如,在测试密码检查器方法时,您希望断言除了拒绝错误的密码外,它还会调用一些审计后端系统来注册失败的登录尝试。您的模拟对象将代表该后端系统,您可以使用它来验证它最终被调用(以及使用适当的参数)。

答案 3 :(得分:1)

简化...假设您正在使用某些参数测试方法 A 。 A所采用的方法是调用方法 B C D

使用 Mockito.verify ,您可以测试方法B,C,D是否真的被调用。它甚至允许您指定更复杂的测试,例如:

  • ATLEAST(1)
  • atMost(10)

当您测试的方法根据您调用的参数表现不同时,它确实非常有用。

答案 4 :(得分:0)

让我们假设您有一些DAO类,它通过普通JDBC与数据库交互。您有一些方法可以在数据库中写入数据并希望对其进行单元测试。为此,您可能会模拟Connection类。当您在数据库中编写时,您可能会在此模拟上调用commit方法,但它的返回类型为void,因此您无法保证在测试期间调用该方法。要解决此类问题,您可以使用verify。 希望它有所帮助!

答案 5 :(得分:0)

方法返回任何内容或void 在单元测试中,当一个方法返回一些东西时,通常你想用特定的值模拟它的结果,并检查测试方法的流程是否按原样进行。
有意义的是,模拟的方法返回一些东西,通常你需要它的结果:在测试方法的下一个语句中或在测试方法返回的结果中。

由于方法不返回任何内容(void),因此情况有所不同:您无法模拟其结果 但是你可以断言调用这个方法并使用预期的参数。

例如想象一个PrinterService类来打印文档

public class PrintService{
 ...
  public void printMessage(String message){
    os.print(message);
  }
}

并且假设您需要在另一个班级的单元测试中将其隔离 这里测试方法:

public class PrintClient{
 ...
  PrintService printService;

  public void print(String message, PrinterParameters printerParameters...){
     ... // do some tasks
     ...
     printService.print(message);
    ...          
  }
}

PrintService.print()什么都不返回 因此,在PrintClient的单元测试中,您不希望模仿PrintService.print()的结果,因为它没有。 您只想检查它是否已通过传递给message参数调用 到PrintClient测试方法。

@RunWith(MockitoJUnitRunner.class) 
public class PrintClientTest{

    @Mock 
    PrintService printServiceMock;
    ...
    @Test
    pubic void print(){
      ... 
      String message = "my message";  
      PrintClient printClient = new PrintClient(printServiceMock);
      printClient.print(message, ...);
      //
      Mockito.verify(printServiceMock).print(message);
      ...
    }
}