如何在JUnit中捕获静态void方法的参数

问题描述

如何测试我的方法使用正确的参数调用静态void方法

public void sendMessages(Collection<Message> messages) {
    messages.forEach(message -> {
        String type = calculateType(message);
        Postman.send(type,message.getText());
    });
}

解决方法

是的,您需要使用PowerMock。

  1. 将这些添加到课程级别:
@RunWith(PowerMockRunner.class)
@PrepareForTest(YourClass.class)
  1. PowerMockito.verifyStatic(VerificationModeFactory.times(2)); Postman.send(type,message.getText());

在这里,您可以使用Mockito的ArgumentCaptor

来代替type和message.getText()。 ,

在像这样的静态void方法上使用PowerMock的mockStatic()和verifyStatic()以及Mockito的ArgumentCaptor可以防止实际的静态方法被调用并验证是否已使用正确的参数调用了该方法:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Postman.class)
public class MyTest {

    @Test
    public void testSendMessages() {
        // given
        List<Message> messages = Arrays.asList(new Message("text1"),new Message("text2"));
        PowerMockito.mockStatic(Postman.class);

        // when
        instance.sendMessages(messages);

        // then
        ArgumentCaptor<String> messageTextCaptor = ArgumentCaptor.forClass(String.class);
        PowerMockito.verifyStatic(Mockito.times(2));
        Postman.send(Matchers.any(),messageTextCaptor.capture());
        List<String> capturedMessageTexts = messageTextCaptor.getAllValues();
        assertThat(capturedMessageTexts.get(0),CoreMatchers.equalTo("text1"));
        assertThat(capturedMessageTexts.get(1),CoreMatchers.equalTo("text2"));
    }

}