保存由Mockito监视的信息

时间:2018-12-19 15:43:59

标签: java junit mockito powermockito

我的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 调用,将其参数存储在某个数组中,然后继续使用实数方法吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

使用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
}

答案 2 :(得分:1)

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

@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()。通常,当您对某项进行单元测试时,您希望尽可能地精确。因此,在结果验证期间使用具体的对象。

希望对您有帮助