首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Junit5在GreenMail服务器上测试GreenMail电子邮件

使用Junit5在GreenMail服务器上测试GreenMail电子邮件
EN

Stack Overflow用户
提问于 2020-01-31 15:37:11
回答 2查看 3.3K关注 0票数 0

我正在尝试为Spring电子邮件编写JUnit5测试。当我运行测试时,Greenmail服务器没有收到任何消息。为相同的代码段附加代码段:

代码语言:javascript
复制
@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.");
    }
}

}

下面是我写这个测试的课程

代码语言:javascript
复制
@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的来源:

代码语言:javascript
复制
---
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类,但当我试图运行测试,它没有得到任何介面。

我什么都试过了,但没有得到任何运气。任何帮助都是非常感谢的。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-02-02 05:14:06

我可以从EmailServiceImpl类发送电子邮件,但是当我试图运行测试时,它没有收到任何消息。

你不应该在测试中得到信息。负责与SMTP服务器实际通信的低级组件是JavaMailSender,在EmailServiceImpl类中,您确实通过以下方式发送实际电子邮件:

代码语言:javascript
复制
javaMailSender.send(message);

然而,在测试中,模拟了这个类的

代码语言:javascript
复制
@Mock
private JavaMailSender javaMailSender;

因此,如果在EmailServiceImpl中放置调试器断点,您将看到javaMailSender数据字段包含一个模拟。模拟不应该发送任何内容,它只允许指定期望并在以后进行验证。它不会发送任何实际的电子邮件。

代码语言:javascript
复制
// 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);

在测试中,您根本不使用spring,所以没有加载bean,也没有实际加载yaml文件中可用的spring配置。

票数 3
EN

Stack Overflow用户

发布于 2021-02-23 07:59:50

在调试模式下启动服务器/测试,并查看JavaMailSender (端口和主机)的连接参数。因此,在测试yaml文件中正确设置这些参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60006964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档