java 我如何测试 Spring 的 JavaMailSender

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/16854993/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-01 00:11:08  来源:igfitidea点击:

How do I test the JavaMailSender of Spring

javaspringjakarta-eecharacter-encodingjavamail

提问by Jordi P.S.

I have a service that has injected the JavaMailSender. My service configures it and sends a mail. I'd like to intercept the raw mail to ensure the information is the correct. I'd like to do that in a JUnit.

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

How would you guys do that?

你们会怎么做?

@Service
public class MyServiceImpl {

    @Autowired
    private JavaMailSender _mailSender;

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

回答by dimitrisli

I've done it using GreenMail. Take a look at my blog post about itwhere you'll also find a working example.

我已经使用GreenMail完成了。看看我关于它的博客文章,在那里你还可以找到一个工作示例。

回答by TrueDub

You can use a test SMTP server, like Dumbster. See the example below:

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

@Test
    public void sendSimpleEmailWithCC() {
        // Runs a Dumbster simple SMTP server - default config
        SimpleSmtpServer server = SimpleSmtpServer.start();
        String from = "[email protected]";
        String to = "[email protected]";
        String messageText = "Good message";
        String title = "Test message";
        String cc = "[email protected]";
        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));
    }

回答by Justas

If your goal is to use just Junit/Mockito and test how MimeMessage was formed before sending then the configuration below should be sufficient:

如果您的目标是仅使用 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 = "[email protected]"
        EmailRequest request = new EmailRequest();
        request.setRecipient(recipient);
        emailServiceImpl.send(request);
        assertEquals(recipient, mimeMessage.getRecipients(RecipientType.TO)[0].toString());
    }
}