保存被 Mockito 侦测到的信息

Save information that was spied by Mockito

我有一个 JUnit 测试:

@Spy
ParallelSender parallelSender = new ParallelSender();


@Test
public void send() {   
    // making some data...
    parallelSender.send(someData);
    // check that internal method has been called with Sender Task made from someData
    verify(parallelSender).doSend(any(SenderTask.class));
}

不过,我想检查 SenderTask 是否包含我需要的所有字段。我可以告诉间谍拦截 doSend 调用,将其参数存储在某个数组中,然后继续使用真正的方法吗?

您可以使用 ArgumentCaptor.

@Captor
ArgumentCaptor<SenderTask> captor;
// or ArgumentCaptor<SenderTask> captor = 
//         ArgumentCaptor.forClass(SenderTask.class);

@Test public void send() {
    // ...
    verify(parallelSender).doSend(captor.capture());
    SenderTask captured = captor.getValue();

使用ArgumentCaptor:

@Test
public void send() {   
    // making some data...
    parallelSender.send(someData);

   // Define the captor for class
    ArgumentCaptor<SenderTask> captor =
        ArgumentCaptor.forClass(SenderTask.class);

    // Capture input while verifying
    verify(parallelSender).doSend(captor.capture());

    // Assert 
    SomeTask result = captor.getValue();
    // assertions on result
}

我很少使用参数捕获器,因为通常没有必要。 就这样做

@Test
public void send() {   
    //given
    SomeData myInput = ...
    SenderTask expectedOutput = new SenderTask();
    expectedOutput.setSomeField(/*expected field value*/);

    //when
    parallelSender.send(myInput);

    //then
    verify(parallelSender).doSend(expectedOutput);
 }

背后的想法是检查 "doSend" 是否使用预期对象调用。

注意:只需确保您在 SenderTask 中实现了 equals/hash 方法 - 否则它将不起作用

注意 2:我建议避免在单元测试中使用 any() 。通常当你对某些东西进行单元测试时——你希望尽可能精确。所以在结果验证时使用具体的对象。

希望对你有帮助