Тесты Junit5 для Spring Email с GreenMail Server с использованием SMTP - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь написать тесты JUnit5 для Spring Email. Когда я запускаю тест, сервер Greenmail не получает никаких сообщений. Прикрепление фрагментов кода для того же самого:

@ExtendWith(MockitoExtension.class)
public class EmailServiceImplTest {

Mail emailEntity;

GreenMail serverA;

@InjectMocks
private EmailServiceImpl emailService;

@Mock
private JavaMailSender javaMailSender;

@BeforeEach
void setUp() {
    MockitoAnnotations.initMocks(this);
    emailEntity = mockItemMasterData();
    // Setup fake smtp server.
    serverA = new GreenMail(ServerSetupTest.SMTP);
    serverA.start();
}


private Mail mockItemMasterData() {
    Mail mail = new Mail();
    mail.setFrom("no-reply@test.com");
    mail.setTo("no-reply@test.com");
    mail.setSubject("Spring Mail Integration Testing with JUnit and GreenMail Example");
    mail.setBody("We show how to write Integration Tests using Spring and GreenMail.");
    mail.setSendDate(Date.from(Instant.ofEpochSecond(System.currentTimeMillis())));
    return mail;
}

@Test
public void testSendEmailToAvailableMailboxReturnEmail() throws SendFailedException {

    // Using javamailsenderimpl to send the mail.
    emailService.sendSimpleMessage(emailEntity);

    try {
        Message[] messages = serverA.getReceivedMessages();
        Assert.assertNotNull(messages);
        Assert.assertEquals(1, messages.length);
        Assert.assertEquals(emailEntity.getSubject(), messages[0].getSubject());
        Assert.assertEquals(emailEntity.getBody(), String.valueOf(messages[0].getContent()).contains("body"));

    } catch (MessagingException | IOException e) {
        Assert.fail("Should be able to retrive sent mail.");
    }
}

}

И вот класс, для которого я пишу этот тест

@Component
@Slf4j
public class EmailServiceImpl implements EmailService {

@Autowired
private JavaMailSender javaMailSender;

@Override
public void sendSimpleMessage(Mail mail) throws SendFailedException {
    log.info("Send mail started ");
    SimpleMailMessage message = new SimpleMailMessage();
    message.setTo(mail.getTo());
    message.setFrom(mail.getFrom());
    message.setSubject(mail.getSubject());
    message.setText(mail.getBody());
    message.setSentDate(mail.getSendDate());
    javaMailSender.send(message);
    log.info("Send mail end ");
 }
 }

Ниже приведен источник теста yaml:

---
spring:
 mail:
   default-encoding: UTF-8
   host: localhost
   jndi-name:
   username: username
   password: secret
   port: 2525
   properties:
     mail:
      debug: false
      smtp:
       debug: false
       auth: true
       starttls: true
  protocol: smtp
  test-connection: false

Я могу отправить электронное письмо из EmailServiceImpl класса, но когда я пытаюсь запустить тест, я не получаю никаких сообщений.

Я попробовал все, но не получилось. Буду очень признателен за любую помощь.

Спасибо.

1 Ответ

1 голос
/ 02 февраля 2020

Я могу отправить электронное письмо из класса EmailServiceImpl, но когда я пытаюсь запустить тест, он не получает никаких сообщений.

Вы не должны получать сообщения в тесте. Низкоуровневый компонент, отвечающий за фактическую связь с SMTP-сервером, - JavaMailSender, а в классе EmailServiceImpl вы действительно отправляете фактическое электронное письмо по телефону:

javaMailSender.send(message);

Однако в тесте вы mocked этот класс:

@Mock
private JavaMailSender javaMailSender;

Так что, если вы установите точку останова отладчика в EmailServiceImpl, вы увидите, что поле данных javaMailSender содержит макет. Макет не должен ничего отправлять, он только позволяет указать ожидания и проверить позже. Он не будет отправлять реальное электронное письмо.

// in the setup code - setup what do you expect from mock (I assume javaMailSender.send returns void):
 doNothing().when(javaMailSender).send(message);

// in the verification part of the test - make sure that the mock was called once with the params that you expect:
 verify(javaMailSender, times(1)).send(message);

Одно слово о весне, просто для пояснения - в тесте вы вообще не используете пружину, поэтому бобы не загружаются и конфигурация пружины недоступна в Файл yaml фактически не загружен.

...