Mic*_*ski 5 methods mocking call mockito
很容易验证Mockito中的模拟对象上发生了特定的交互(特定方法调用),并且verifyZeroInteractions()检查没有发生任何交互.假设我测试的接口,例如,一个记录器,用的方法,如info(),warn(),error()等等.在我知道的这些方法应该被称为一个特定的场景,但我真的不关心哪一个.是否有一种紧凑的方法来检查是否发生了与模拟对象的任何交互,而无需指定应该调用哪个确切的方法?或者也许这样的机制不是必需的,因为测试它的"Mockito方式"会与我想象的不同?
如果要检查是否与模拟对象发生了任何交互,可以使用该Mockito.mockingDetails()方法并检查调用次数是否不为零。当然,您也可以根据模拟细节进行更详细的断言,但我想只是检查不为零就可以回答您的问题。
@ExtendWith(MockitoExtension.class)
public class TestClass {
@Mock
private Logger logger;
@InjectMocks
private Service service;
@Test
public void testMethod_shouldLogMultipleTimes() {
service.testMethod();
assertThat(Mockito.mockingDetails(logger).getInvocations().size()).isNotZero();
}
}
Run Code Online (Sandbox Code Playgroud)
该代码示例用于assertj检查调用次数是否不为零。
如果您可以从被测类外部化记录器对象的创建,那么您就没有理由不能编写自己的日志接口测试实现,该实现将记录执行了哪些方法并将其作为测试设置的一部分注入。
模拟库有很多好处,但有时会出现一些极端情况,就像您发现的那样,它们可能无法满足您的需求。
如果您编写自己的实现来进行这样的测试,并将其注入到正在测试的测试类中,那么您可以断言getCount() > 0
public class LoggerTestSupportImpl implements ILogger {
private int count = 0;
@Override
public int getCount() {
return count;
}
@Override
public void info(String message) {
count++;
}
@Override
public void warn(String message) {
count++;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2439 次 |
| 最近记录: |