无需创建另一个我可以注入的类。是否可以模拟javax.mail.Transport
,以便我可以Transport.send()
在 Java EE 7 上对该方法进行一些模拟测试?
9 回答
跟进 Bill Shanon 的解决方案,因为 Dumbster 没有当前工作的 Maven Central 工件,我使用了 GreenMail。
然后我使用了以下代码:
final GreenMail mailServer = new GreenMail();
mailServer.start();
final Properties mailSessionProperties = new Properties();
mailSessionProperties.put("mail.smtp.port", String.valueOf(mailServer.getSmtp().getPort()));
final javax.mail.Session mailSession = javax.mail.Session.getInstance(mailSessionProperties);
testObject.setMailSession(mailSession);
这种方式testObject
不需要更改,即使它对Transport.send(message)
.
如果您想要在测试时不调用 Transport.send,那么您可以使用它:
@RunWith(PowerMockRunner.class)
@PrepareForTest(javax.mail.Transport.class)
public class MyClassTest {
@Before
public void before() throws Exception {
suppress(method(Transport.class, "send", Message.class));
}
}
另请参阅https://groups.google.com/forum/#!topic/powermock/r26PLsrcxyA
另一种尚未讨论的方法是将对 Transport.send(message) 的调用包装在一个委托调用的类中。这在您的代码库中有点开销,但它允许您模拟您的委托类并创建您想要的结果。
public class TransportDelegator {
public void send(Message msg) throws MessagingException {
Transport.send(msg)
}
}
然后像在您使用的任何框架中一样模拟 TransportDelegator。
是的。途中是使用 Mockito。 https://code.google.com/p/mockito/
public class CategoryDAOTest {
private Transport transport = Mockito.mock(Transport.class);
@Test
public void sendMessage() throws MessagingException {
transport.sendMessage(null, null);
}
}
或者,使用注释来创建模拟:
@RunWith(MockitoJUnitRunner.class)
public class CategoryDAOTest {
@Mock
private Transport transport;
@Test
public void sendMessage() throws MessagingException {
transport.sendMessage(null, null);
}
}
我创建了一个新的包装类并用 Mockito 模拟了它。这使我无法将 PowerMock 添加到我的项目中。
public class MyTransport{
public void send(MineMessage msg) throws MessagingException{
javax.mail.Transport.send(msg);
}
}
在侧面测试课中,我们只需要
@Mock
private MyTransport myTransport
这在被调用时什么都不做。您可能还想验证 myTransport 是否被调用。
Mockito.verify(myTransport).send(correctMsg);
另一种方法是使用伪造的 SMTP 服务器,例如Dumbster。JavaMail 源工作区中的 JUnit 测试使用类似的方法。
如果您在 linux / osx 上,您可以使用 python 创建一个模拟 smtp 服务器,如下所示:
python -m smtpd -n -c DebuggingServer localhost:1025
然后,如果您连接到 localhost 上的端口 1025 并且您可以发送电子邮件就足够了。Python 代码可以通过简单的 ProcessBuilder 调用来启动(如何从 Java 代码运行 Unix shell 脚本?)。
你可以试试 JavaMail Mock2 https://github.com/salyh/javamail-mock2
它主要专注于 IMAP/POP3,但也可以使用 SMTP Mock。在您的情况下,“Fullmock”模式是一个不错的选择。它也可以在 Maven 中心使用。
这就是我经过数小时研究后所做的事情,我正在向我的方法发送附件路径列表以及电子邮件。一切正常
@Test
public void testWhenMigrationReportSentSuccessfully() throws Exception {
mockStatic(Transport.class);
PowerMockito.doNothing().when(Transport.class, "send", any(Message.class));
service.report(anyList(), "client@dummy.com");
}