代码之家  ›  专栏  ›  技术社区  ›  onkami

保存Mockito发现的信息

  •  0
  • onkami  · 技术社区  · 6 年前

    我的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是否完全包含我需要的所有字段。我能告诉间谍截获 剂量 调用,将其参数存储在某个数组中,然后继续使用real方法?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Maciej Kowalski    6 年前

    使用 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
  •   daniu    6 年前

    你可以使用 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();
    
        3
  •  1
  •   Yurii Bondarenko    6 年前

    我很少使用参数捕获器,因为它通常是不必要的。 就这么做

    @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:我建议不要在单元测试中使用任何()。通常,当您进行单元测试时——您希望尽可能精确。所以在结果验证期间使用具体的对象。

    希望有帮助