16

我有一个注入 JavaMailSender 的服务。我的服务对其进行配置并发送邮件。我想拦截原始邮件以确保信息正确。我想在 JUnit 中做到这一点。

你们会怎么做呢?

@Service
public class MyServiceImpl {

    @Autowired
    private JavaMailSender _mailSender;

    public void sendMail(String to, String body, String subject){
        ...
        _mailSender.something
        ...
    }
}
4

4 回答 4

24

我已经使用GreenMail完成了。看看我关于它的博客文章,您还会在其中找到一个工作示例。

于 2013-05-31T10:23:28.813 回答
5

您可以使用测试 SMTP 服务器,例如Dumbster。请参见下面的示例:

@Test
    public void sendSimpleEmailWithCC() {
        // Runs a Dumbster simple SMTP server - default config
        SimpleSmtpServer server = SimpleSmtpServer.start();
        String from = "whoever@from.com";
        String to = "whoever@to.com";
        String messageText = "Good message";
        String title = "Test message";
        String cc = "whoever@cc.com";
        Assert.assertTrue(mailSender
                .sendEmail(from, to, cc, title, messageText));
        server.stop();
        Assert.assertTrue(server.getReceivedEmailSize() == 1);
        Iterator emailIter = server.getReceivedEmail();
        SmtpMessage email = (SmtpMessage) emailIter.next();
        Assert.assertTrue(email.getHeaderValue("From").equals(from));
        Assert.assertTrue(email.getHeaderValue("To").equals(to));
        Assert.assertTrue(email.getHeaderValue("Cc").equals(cc));
        Assert.assertTrue(email.getHeaderValue("Subject")
                .equals("Test message"));
        Assert.assertTrue(email.getBody().equals(messageText));
    }
于 2013-05-31T11:12:26.720 回答
2

如果您的目标是仅使用 Junit/Mockito 并在发送之前测试 MimeMessage 是如何形成的,那么下面的配置就足够了:

public class EmailServiceTest {

    private EmailServiceImpl emailServiceImpl;

    private JavaMailSender javaMailSender;

    private MimeMessage mimeMessage;

    @Before
    public void before() {
        mimeMessage = new MimeMessage((Session)null);
        javaMailSender = mock(JavaMailSender.class);
        when(javaMailSender.createMimeMessage()).thenReturn(mimeMessage);
        emailServiceImpl = new EmailService(javaMailSender);
    }

    @Test
    public void emailTest() {
        String recipient = "example@example.com"
        EmailRequest request = new EmailRequest();
        request.setRecipient(recipient);
        emailServiceImpl.send(request);
        assertEquals(recipient, mimeMessage.getRecipients(RecipientType.TO)[0].toString());
    }
}
于 2019-02-23T00:12:23.273 回答
2

要为这个问题添加一个更新的答案,并且由于 2012 年的链接博客文章似乎偶尔会被关闭,这里有一个使用 GreenMail 编写与 JUnit 5 的集成测试的完整示例(假设您使用 Spring Boot 的自动配置JavaMailSender)。

首先,确保覆盖邮件服务器的凭据和位置。为此,您可以在其中添加一个application.yml文件:src/test/resources

spring:
  mail:
    password: springboot
    username: duke
    host: 127.0.0.1
    port: 3025 # default protocol port + 3000 as offset
    protocol: smtp
    test-connection: true

接下来,Spring Boot 的自动配置将配置JavaMailSender连接到 GreenMail 以进行测试。您可以使用 GreenMail 的 JUnit Jupiter 扩展来方便地启动/停止 GreenMail 服务器以进行测试:

<dependency>
  <groupId>com.icegreen</groupId>
  <artifactId>greenmail-junit5</artifactId>
  <version>1.6.1</version>
  <scope>test</scope>
</dependency>

...导致以下示例测试:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class JavaMailSenderIT {

  @RegisterExtension
  static GreenMailExtension greenMail = new GreenMailExtension(ServerSetupTest.SMTP)
    .withConfiguration(GreenMailConfiguration.aConfig().withUser("duke", "springboot"))
    .withPerMethodLifecycle(false);

  @Autowired
  private JavaMailSender javaMailSender;

  @Test
  void shouldUseGreenMail() throws Exception {

    SimpleMailMessage mail = new SimpleMailMessage();
    mail.setFrom("admin@spring.io");
    mail.setSubject("A new message for you");
    mail.setText("Hello GreenMail!");
    mail.setTo("test@greenmail.io");


    javaMailSender.send(mail);

    // awaitility
    await().atMost(2, SECONDS).untilAsserted(() -> {
      MimeMessage[] receivedMessages = greenMail.getReceivedMessages();
      assertEquals(1, receivedMessages.length);

      MimeMessage receivedMessage = receivedMessages[0];
      assertEquals("Hello GreenMail!", GreenMailUtil.getBody(receivedMessage));
      assertEquals(1, receivedMessage.getAllRecipients().length);
      assertEquals("test@greenmail.io", receivedMessage.getAllRecipients()[0].toString());
    });
  }
}

您还可以使用 Testcontainers 启动本地 GreenMail 容器作为本地沙盒电子邮件服务器。

于 2021-10-26T16:17:38.727 回答