模拟 MIMEMessage 的正确方法?

ksl*_*u25 4 java mime jakarta-mail mockito

我想实际验证消息上设置的字段,例如正文、主题、发件人等\xe2\x80\xa6 我\xe2\x80\x99也尝试过执行参数捕获器,但\xe2\x80\x99不起作用当我调试代码时,消息在获取 javaMailSender.send(message) 行时始终显示空字段。

\n\n

模拟 MIMEMessage 是否有最佳实践?

\n\n
//EmailService.java\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.mail.javamail.JavaMailSender;\nimport org.springframework.mail.javamail.MimeMessageHelper;\n\nimport javax.mail.MessagingException;\nimport javax.mail.internet.MimeMessage;\n\n@Slf4j\npublic class EmailService {\n    private JavaMailSender javaMailSender;\n\n    @Autowired\n    public EmailService(JavaMailSender javaMailSender) {\n        this.javaMailSender = javaMailSender;\n    }\n\n\n    public void sendEmail() {\n        MimeMessage message = javaMailSender.createMimeMessage();\n        String body = "<html>\\n" +\n            "<p> This the body </p>\\n" +\n            "<br>\\n";\n        try {\n            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, true);\n            mimeMessageHelper.setSubject("subject");\n            mimeMessageHelper.setTo("stack@overflow.com");\n            mimeMessageHelper.setFrom("overflow@stack.com");\n            mimeMessageHelper.setText(body, true);\n\n            javaMailSender.send(message);\n\n        } catch (MessagingException e) {\n            log.error("error");\n        }`enter code here`\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

下面是测试

\n\n
//EmailServiceTest.java\n\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.mockito.ArgumentCaptor;\nimport org.mockito.Mock;\nimport org.springframework.mail.javamail.JavaMailSender;\n\nimport javax.mail.MessagingException;\nimport javax.mail.internet.MimeMessage;\nimport java.io.IOException;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.mockito.Mockito.*;\nimport static org.mockito.MockitoAnnotations.initMocks;\n\n\npublic class EmailServiceTest {\n    private EmailService emailService;\n\n    @Mock\n    private JavaMailSender javaMailSender;\n\n    @Mock\n    private MimeMessage message;\n\n    @Before\n    public void setUp() throws IOException {\n        initMocks(this);\n\n        emailService = new EmailService(javaMailSender);\n    }\n\n    @Test\n    public void sendEmail_sendsEmailWithCorrectContent() throws MessagingException {\n        ArgumentCaptor<MimeMessage> mimeMessageArgumentCaptor = ArgumentCaptor.forClass(MimeMessage.class);\n        when(javaMailSender.createMimeMessage()).thenReturn(message);\n\n        doNothing().when(javaMailSender).send(message);\n\n        emailService.sendEmail();\n\n        verify(javaMailSender, times(1)).send((mimeMessageArgumentCaptor.capture()));\n        assertEquals("subject", mimeMessageArgumentCaptor.getValue().getSubject());\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Ber*_*nie 5

使用集成测试进行此类测试通常更容易。电子邮件通常是使用模板库(例如 freemarker)构建的,因此集成测试对于验证模板是否正确非常有价值。

您可以通过使用PowerMock创建模拟来进行单元测试MimeMessageHelper,但 PowerMock 有时在跟上其他测试库的更改方面可能很慢,并且此类测试通常会变得脆弱且没有什么价值。例如,您可以验证setSubject()被调用mimeMessageHelper,但这是否会产生您真正想要测试的结果(主题设置为message)?