我正在尝试为Spring电子邮件编写JUnit5测试。当我运行测试时,Greenmail服务器没有收到任何消息。为相同的代码段附加代码段:
@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.");
}
}
}下面是我写这个测试的课程
@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的来源:
---
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类,但当我试图运行测试,它没有得到任何介面。
我什么都试过了,但没有得到任何运气。任何帮助都是非常感谢的。
谢谢。
发布于 2020-02-02 05:14:06
我可以从EmailServiceImpl类发送电子邮件,但是当我试图运行测试时,它没有收到任何消息。
你不应该在测试中得到信息。负责与SMTP服务器实际通信的低级组件是JavaMailSender,在EmailServiceImpl类中,您确实通过以下方式发送实际电子邮件:
javaMailSender.send(message);然而,在测试中,模拟了这个类的:
@Mock
private JavaMailSender javaMailSender;因此,如果在EmailServiceImpl中放置调试器断点,您将看到javaMailSender数据字段包含一个模拟。模拟不应该发送任何内容,它只允许指定期望并在以后进行验证。它不会发送任何实际的电子邮件。
// 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配置。
发布于 2021-02-23 07:59:50
在调试模式下启动服务器/测试,并查看JavaMailSender (端口和主机)的连接参数。因此,在测试yaml文件中正确设置这些参数。
https://stackoverflow.com/questions/60006964
复制相似问题