保存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

@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
}

您可以使用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();

我很少使用参数绑架者,因为通常不是必需的。只需做这个

@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中实现等于/哈希方法 - 否则它将无法使用

Note2:我建议避免在单元测试中使用任何()。通常,当您进行单位测试的某些内容时 - 您希望尽可能精确。因此,在结果验证期间使用具体对象。

希望它能有所帮助

相关内容

  • 没有找到相关文章

最新更新