2011-09-15 37 views
0

我正在使用UnitilsJUnit4和EasyMock在我的代码中测试邮件功能。使用EasyMock进行单元测试时发生意外的方法调用

我的代码是这样的..

public void prepare(MimeMessage mimeMessage) { 
// some code .. 
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true); 
// some mail settings .. 

} 

当我测试的方法prepare,这是给下面的异常..但它在下面显示的方法是从Spring框架类。

java.lang.AssertionError: 
    Unexpected method call setContent([email protected]): 
    setContent([email protected]): expected: 1, actual: 0 
    at $javax.mail.internet.MimeMessage$$EnhancerByCGLIB$$614de43f.setContent(<generated>) 
    at org.springframework.mail.javamail.MimeMessageHelper.createMimeMultiparts(MimeMessageHelper.java:344) 
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:290) 
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:247) 
    at org.springframework.mail.javamail.MimeMessageHelper.<init>(MimeMessageHelper.java:226) 

请帮我解决上面的问题..如何测试我的方法?

回答

1

你似乎在嘲笑错误的东西。当你嘲笑Spring类时,你正在嘲笑Mail API,因为这是你直接与之交互的东西。你现在这样做的方式,你有效地测试了Spring类和你自己,这不是你想要的。

1

您需要模拟MimeMessageHelper。你不能注入它,因为它在构造函数中使用了mimeMessage。所以要做到这一点,你需要像PowerMock

documentation

  1. 在测试用例的 类级使用@RunWith(PowerMockRunner.class)注释。
  2. 使用@PrepareForTest(ClassThatCreatesTheNewInstance.class) 注释 测试用例的类级别。
  3. 使用 PowerMock.createMock(NewInstanceClass.class)来创建要构建的类的模拟 对象 (姑且称之为 mockObject)。
  4. 使用 PowerMock.expectNew(NewInstanceClass.class).andReturn(mockObject) 到 期望类型 NewInstanceClass.class的对象的新建筑,而是返回模仿对象。
  5. 使用 PowerMock.replay(mockObject,NewInstanceClass.class)来改变 模拟对象和类重放模式中,可替代地使用 PowerMock.replayAll()方法。
  6. 使用PowerMock.verify(mockObject, NewInstanceClass.class)来改变模拟对象和类 验证模式,或者使用PowerMock.verifyAll()方法。

很显然,我真的不知道你想考什么,而是你的测试看起来是这样的:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(MessagePreparer.class) 
public class MessagePreparerTest { 

    @Test 
    public void testPrepare() { 
    MimeMessage mockMessage = PowerMock.createMock(MimeMessage.class); 
    MimeMessageHelper mockMessageHelper = PowerMock.createMock(MimeMessageHelper.class); 
    PowerMock.expectNew(MimeMessageHelper.class, 
         mockMessage, true).andReturn(mockMessageHelper); 
    // ...set other expectations 
    PowerMock.replay(mockMessage, mockMessageHelper, MimeMessageHelper.class); 
    MessagePreparer messagePreparer = new MessagePreparer(); 
    messagePreparer.prepare(mockMessage); 
    PowerMock.verify(mockMessage, mockMessageHelper, MimeMessageHelper.class); 
    } 
} 
2

我知道这是很久以前写的,但我刚刚遇到了这个完全相同的问题。

如果你能以某种形式模拟MimeMessageHelper,你可以很容易地测试代码。我通过创建一个只提供MimeMessageHelper类并将其作为依赖项添加到正在测试的类的接口来实现此目的。

接口:

public interface MimeMessageHelperProvider { 
    MimeMessageHelper getMimeMessageHelper(MimeMessage mimeMessage); 
} 

实现:

public class MimeMessageHelperProviderImpl implements MimeMessageHelperProvider { 
    @Override 
    public MimeMessageHelper getMimeMessageHelper(MimeMessage mimeMessage) { 
     return new MimeMessageHelper(mimeMessage); 
    } 
} 

现在你可以在MimeMessageHelperProvider接线,简单地嘲笑该接口将它回报你,你可以验证对一个实例。

相关问题