你能解释一下mockito方法验证的任务吗?文档说,这个方法检查方法是否被调用。但是,当它真的有用时,你能给出一个例子吗?通常在测试方法中我们调用一个方法然后...检查,我们现在调用它?听起来很奇怪。
答案 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是否真的被调用。它甚至允许您指定更复杂的测试,例如:
当您测试的方法根据您调用的参数表现不同时,它确实非常有用。
答案 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);
...
}
}