2011-09-15 61 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接線,簡單地嘲笑該接口將它回報你,你可以驗證對一個實例。

相關問題