是否有可能以紧凑的方式使用Mockito验证任意交互?

Mic*_*ski 5 methods mocking call mockito

很容易验证Mockito中的模拟对象上发生了特定的交互(特定方法调用),并且verifyZeroInteractions()检查没有发生任何交互.假设我测试的接口,例如,一个记录器,用的方法,如info(),warn(),error()等等.在我知道的这些方法应该被称为一个特定的场景,但我真的不关心哪一个.是否有一种紧凑的方法来检查是否发生了与模拟对象的任何交互,而无需指定应该调用哪个确切的方法?或者也许这样的机制不是必需的,因为测试它的"Mockito方式"会与我想象的不同?

Max*_*Max 5

如果要检查是否与模拟对象发生了任何交互,可以使用该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检查调用次数是否不为零。


Bra*_*rad 2

如果您可以从被测类外部化记录器对象的创建,那么您就没有理由不能编写自己的日志接口测试实现,该实现将记录执行了哪些方法并将其作为测试设置的一部分注入。

模拟库有很多好处,但有时会出现一些极端情况,就像您发现的那样,它们可能无法满足您的需求。

如果您编写自己的实现来进行这样的测试,并将其注入到正在测试的测试类中,那么您可以断言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)