5

无需创建另一个我可以注入的类。是否可以模拟javax.mail.Transport,以便我可以Transport.send()在 Java EE 7 上对该方法进行一些模拟测试?

4

9 回答 9

7

跟进 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).

于 2013-07-04T00:42:41.320 回答
2

如果您想要在测试时调用 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

于 2015-04-03T17:54:24.733 回答
2

另一种尚未讨论的方法是将对 Transport.send(message) 的调用包装在一个委托调用的类中。这在您的代码库中有点开销,但它允许您模拟您的委托类并创建您想要的结果。

public class TransportDelegator {
    public void send(Message msg) throws MessagingException {
        Transport.send(msg)
    }
}

然后像在您使用的任何框架中一样模拟 TransportDelegator。

于 2017-10-20T03:53:31.850 回答
1

是的。途中是使用 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);
    }
}  
于 2013-07-03T20:52:38.880 回答
1

我创建了一个新的包装类并用 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);
于 2019-01-28T13:06:51.863 回答
0

另一种方法是使用伪造的 SMTP 服务器,例如Dumbster。JavaMail 源工作区中的 JUnit 测试使用类似的方法。

于 2013-07-03T21:05:40.840 回答
0

如果您在 linux / osx 上,您可以使用 python 创建一个模拟 smtp 服务器,如下所示:

python -m smtpd -n -c DebuggingServer localhost:1025

然后,如果您连接到 localhost 上的端口 1025 并且您可以发送电子邮件就足够了。Python 代码可以通过简单的 ProcessBuilder 调用来启动(如何从 Java 代码运行 Unix shell 脚本?)。

于 2014-12-02T14:45:41.710 回答
0

你可以试试 JavaMail Mock2 https://github.com/salyh/javamail-mock2

它主要专注于 IMAP/POP3,但也可以使用 SMTP Mock。在您的情况下,“Fullmock”模式是一个不错的选择。它也可以在 Maven 中心使用。

于 2014-05-03T07:26:20.667 回答
0

这就是我经过数小时研究后所做的事情,我正在向我的方法发送附件路径列表以及电子邮件。一切正常

@Test
public void testWhenMigrationReportSentSuccessfully() throws Exception {
    mockStatic(Transport.class);
    PowerMockito.doNothing().when(Transport.class, "send", any(Message.class));
    service.report(anyList(), "client@dummy.com");
}
于 2020-07-29T08:27:59.773 回答