如何模拟javax.mail.Session

mar*_*tin 10 java email mockito

我需要在单元测试中模拟一个javax.mail.Session对象.类javax.mail.Session标记为final,因此Mockito无法创建模拟.有谁知道如何解决这个问题?

编辑:我的测试是一个Arquillian测试,并且已经有一个注释@RunWith(Arquillian.class).因此,powermock不是一种选择.

now*_*waq 9

您可以稍微重构一下代码.在Martin Fowler的"使用遗留代码"一书中,他描述了一种将外部API(想想Java Mail API)与您自己的应用程序代码分离的技术.这项技术被称为"包裹和皮肤",非常简单.

你应该做的只是:

  1. 通过从javax.mail.Session类中提取方法来创建一个接口MySession(这是你自己的东西).
  2. 通过创建一个具体的类来实现该接口(看起来有点像原始的javax.mail.Session)
  3. 在每个方法中,DELEGATE调用等效的javax.mail.Session方法
  4. 创建实现MySession的模拟类:-)
  5. 更新您的生产代码以使用MySession而不是javax.mail.Session

快乐的测试!

编辑:另请看这篇博文:http://www.mhaller.de/archives/18-How-to-mock-a-thirdparty-final-class.html

  • MimeMessage构造函数需要Session对象.你会怎么处理这个? (2认同)

Bor*_*vić 6

使用PowerMockito来模拟它.

@RunWith(PowerMockRunner.class)
// We prepare PartialMockClass for test because it's final or we need to mock private or static methods
@PrepareForTest(javax.mail.Session.class)
public class YourTestCase {

  @Test
  public void test() throws Exception {

    PowerMockito.doReturn(value).when(classUnderTest, "methodToMock", "parameter1");
  }
}
Run Code Online (Sandbox Code Playgroud)


jhe*_*cks 5

您可以使用Mock JavaMail项目。我首先从川口浩辅找到它。艾伦·弗兰佐尼(Alan Franzoni)在他的博客上也有入门介绍。

当您将此jar文件放在类路径中时,它将替换任何将邮件发送到可以立即检查的内存邮箱中的操作。超级好用。

诚然,将其添加到类路径是模拟某些事情的繁重方式,但是无论如何,您很少希望在自动化测试中发送真实的电子邮件。