greenmail java_JavaMail测试工具之GreenMail

不管现在各种Mock框架的运用有多广,我个人在写单元测试的时候还是特别烦Mock,原因如下:

1. 使用Mock需要Mock所有涉及到得行为,这其实代表了我们是在测试实现,而不是测试执行过程。这样会导致重构的时候经常需要修改很多测试代码。测试应该只关注输入输出,只要输入输出没变,就不应该影响测试。

2. 增加代码复杂度。

3. Mock的时候会不小心屏蔽掉一些实现,增加风险

但是在实际的开发工作中,总是免不了存在外部依赖,比方说依赖某个WebService,或者某个MQ服务,再或者某个Email服务器等等,对于这些外部服务,我更趋向于Stub服务,而不是Mock服务。Stub服务是程序真的和外部的一个服务进行了交互,更符合真实情况。Stub Web Service我会使用DreamHead的Moco框架;MQ服务我会使用ActiveMQ构造一个临时的MQ服务器;而Email呢,我会使用GreeMail构建一个临时的Mail服务器。

Junit和GreenMail

假设我要测试自己的一个MailSender,我会首先把green Mail添加到测试依赖中,然后在Junit测试的setup和teardown中分别启动和关闭Mail Server即可, 代码如下:

public class MyMailSenderTest {

private MyMailSender mailSender;

private GreenMail mailServer;

@Before

public void setUp() throws Exception {

mailServer = new GreenMail(new ServerSetup(12000, null, "smtp"));

mailServer.start();

mailSender = new MyMailSender("localhost", 12000);

}

@After

public void tearDown() throws Exception {

mailServer.stop();

}

@Test

public void shouldSendEmailToServer() throws Exception {

mailSender.sendEmail("Unit Test for java mail Demo");

String receivedMessage = (String) mailServer.getReceivedMessages()[0].getContent();

assertThat(receivedMessage.trim(), equalTo("Unit Test for java mail Demo"));

}

}

实现代码如下:

public class MyMailSender {

private JavaMailSender mailSender;

public boolean sendEmail() {

try {

MimeMessage mimeMessage = mailSender.createMimeMessage();

MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);

mimeMessageHelper.setFrom("xianlinbox@");

mimeMessageHelper.setTo("xianlinbox@");

mimeMessageHelper.setText("Unit Test for java mail Demo");

mailSender.send(mimeMessageHelper.getMimeMessage());

return true;

} catch (MessagingException e) {

return false;

}

}

}

GreenMail还支持验证该消息的确是发送给了某个用户,在上面的实现中,我们要求发送给用户xianlinbox@, 可以通过如下的代码验证如下:

@Test

public void shouldSendToSpecifiedUser() throws Exception {

mailSender.sendEmail("Unit Test for java mail Demo");

GreenMailUser greenMailUser = mailServer.setUser("xianlinbox@", null);

MailFolder inbox = mailServer.getManagers().getImapHostManager().getInbox(greenMailUser);

List messages = inbox.getMessages();

assertThat(messages.size(),equalTo(1));

String content = (String) messages.get(0).getMimeMessage().getContent();

assertThat(content.trim(), equalTo("Unit Test for java mail Demo"));

}

更多用法,参加官网:外链网址已屏蔽

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值