如何测试Spring的JavaMailSender

如何测试Spring的JavaMailSender,java,spring,jakarta-ee,character-encoding,jakarta-mail,Java,Spring,Jakarta Ee,Character Encoding,Jakarta Mail,我有一个注入JavaMailSender的服务。 我的服务配置它并发送邮件。 我想截取原始邮件,以确保信息是正确的。我想在少年时代做这件事 你们会怎么做 @Service public class MyServiceImpl { @Autowired private JavaMailSender _mailSender; public void sendMail(String to, String body, String subject){ ...

我有一个注入JavaMailSender的服务。 我的服务配置它并发送邮件。 我想截取原始邮件,以确保信息是正确的。我想在少年时代做这件事

你们会怎么做

@Service
public class MyServiceImpl {

    @Autowired
    private JavaMailSender _mailSender;

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

我是用电脑做的。看看哪里还有一个工作示例。

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

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

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

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());
    }
}

请不要使用dumbster。它坏得很厉害。改为使用绿色邮件。提供的链接已断开@TrueDub,你能帮我更新一下吗?
(会话)null
这是什么?@DenissM。你问起这一问题已经快一年了,这意味着这些信息可能与你无关。当方法重载时,Java将选择最具体的方法(在本例中为构造函数)。但是,没有类型信息的
null
可以是任何类型。这就是为什么必须将其强制转换为特定类型。在这种情况下,您还可以使用
Mockito.mock(mimessage.class)
而不是
newmimessage((Session)null)
。更清楚一点。