Why are JUnit5 Parametrized tests using argument providers not defined in @ArgumentSource?

232 views Asked by At

I have a problem with my parameterized tests.

  @ParameterizedTest
  @ArgumentsSource(CorrectMessagesArgumentProvider.class)
  void shouldSendMessageForCorrectConfiguration(SmtpConfiguration configuration) {
    var expectedMessageBody = fetchMessage();
    var alertSender = new AlertSender(configuration);
    var alertSubject = subjectFrom();
    alertSender.send(expectedMessageBody, alertSubject);
    var receivedMessages = greenMail.getReceivedMessages();

    assertEquals(1, receivedMessages.length);
  }

  @ParameterizedTest
  @ArgumentsSource(IncorrectMessagesArgumentProvider.class)
  void shouldNotSendMessageForIncorrectConfiguration(SmtpConfiguration smtpConfiguration) {
    var expectedMessageBody = fetchMessage();
    var alertSender = new AlertSender(smtpConfiguration);
    var alertSubject = subjectFrom();

    var expectedErrorMessage = "Error sending alert";
    var actualErrorMessage =
        assertThrows(
            SendAlertException.class, () -> alertSender.send(expectedMessageBody, alertSubject));
    assertTrue(actualErrorMessage.getMessage().contains(expectedErrorMessage));
  }

When I run those tests separetly, they work correctly. But when I run suite, the second test running fails, because it is using arguments from the other test. They're somehow sharing that resource, but I have no idea how. Any ideas?

1

There are 1 answers

0
bkomo On

Okey, I got it - deep in the class responsible for sending emails, I was creating session object by getDefaultInstance(). It was creating singleton which was available for all JVM processes. When I used getInstance() - it work like a charm.