如何模拟难以实例化的类(javax.mail.Message)?

nn4*_*n4l 7 java unit-testing mocking jakarta-mail

我想在我的下一个项目中使用junit测试,但我不确定我应该使用哪几个模拟软件包.我还阅读了几个教程,但我没有找到如何解决下面列出的具体问题的信息.也许我检查过的软件包中没有该功能.

这就是问题所在:我想编写一个电子邮件过滤器类,它List<javax.mail.Message>按主题,日期,从,等来过滤和过滤电子邮件.要测试的代码如下所示:

public List<Message> doFilter(List<Message> messageList) {

    List<Message> newList = new ArrayList<Message>(messageList.size());

    try {
        for (Message message: messageList) {
            if (start != null) {
                Date sentDate = message.getSentDate();
                if (sentDate == null || sentDate.before(start))
                    continue;
            }
            if (end != null) {
                Date receivedDate = message.getReceivedDate();
                if (receivedDate == null || receivedDate.after(end))
                    continue;
            }
            newList.add(message);
        }
    }
    catch(Exception e) {
        e.printStackTrace();
    }
    return newList;
}
Run Code Online (Sandbox Code Playgroud)

所以明显的测试用例是List用一些消息构造一个并检查过滤器返回的新列表是否包含正确的消息.

但它javax.mail.Message是抽象的,不能直接实例化.我需要建立一个真正的电子邮件商店来做到这一点,包括帐户名和密码.

所以我的问题是:

  • 如何javax.mail.Message使用不同的值模拟一些对象,以便我的过滤器类可以调用message.getSentDate()和其他Message方法,检索我在测试设置代码中定义的值?

  • 哪种模拟软件包最适合这类问题?

所有答案都非常感谢.

Jam*_*ven 0

只需创建一个扩展 Message 的类 MockMessage 即可。然后您可以实现或覆盖您想要模拟的行为。

至于模拟框架,我发现这些麻烦超过了它们的价值,但是YMMV。