1

How do I test that my method calls a static void method with the right parameters?

public void sendMessages(Collection<Message> messages) {
    messages.forEach(message -> {
        String type = calculateType(message);
        Postman.send(type, message.getText());
    });
}
Chei
  • 2,117
  • 3
  • 20
  • 33
  • Have look at : https://stackoverflow.com/questions/21105403/mocking-static-methods-with-mockito – Dexter Sep 18 '20 at 10:18

2 Answers2

0

Yes, you need to use PowerMock for that.

  1. Add these to class level:
@RunWith(PowerMockRunner.class)
@PrepareForTest(YourClass.class)
  1. PowerMockito.verifyStatic(VerificationModeFactory.times(2)); Postman.send(type, message.getText());

And here instead of type and message.getText() you can use Mockito's ArgumentCaptor

ACV
  • 9,964
  • 5
  • 76
  • 81
0

Use PowerMock's mockStatic() and verifyStatic() and Mockito's ArgumentCaptor on the static void method like this to prevent the actual static method from being called and to verify that it was called with the right parameters:

@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"));
    }

}
Chei
  • 2,117
  • 3
  • 20
  • 33