2012-04-04 74 views
5

我正在使用EasyMock創建模擬,它是受測試類中的私有參數之一(無setter)。我嘗試使用反射 - 但它無法正常工作。如何將EasyMock模擬注入經過測試的類專用字段

public class TestedClassTest{ 
    @Test 
    public void test(){ 
     TestedClass instance = new TestedClass(); 
     MockedClass mocked = EasyMock.createMock(MockedClass.class); 
     Data data = new Data(); 

     //Void setter 
     DataType dataType = (myDataType.DataType) EasyMock.anyObject(); 
     mocked.setDataType(dataType); 
     EasyMock.expectLastCall(); 

     //expect 
     EasyMock.expect(mocked.getData()).andReturn(data); 
     EasyMock.replay(mocked); 

     Field field = instance.getClass().getDeclaredField("mockedClass") 
     field.setAccessible(true); 
     field.set(instance, mocked); 

     //run tested method 
     instance.someAction(); 

     EasyMock.verify(mocked); 
    } 
} 

即時得到失敗信息:

Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 
junit.framework.AssertionFailedError: 
Unexpected method call MockedClass.setDataType([email protected]): 
MockedClass.getData(): expected: 1, actual: 0 

我敢肯定,這個方法是在測試 「instance.someAction()」 中的 「MockedClass」 對象解僱

如何解決這個問題呢?

編輯 - 答: 糾一倍replay.mocked()後,我發現(這麼簡單!)多了一個無效的方法應該使用EasyMock.expectLastCall()

回答

3

你的反射代碼聲明看起來不錯。

我已經使用EasyMock很長一段時間,但不是replay只應該在測試中每次模擬調用一次?你叫它兩次。嘗試擺脫第一個replay電話。

在這種情況下,將包含模擬的字段公開是否有意義?一般來說,合作者應該通過構造函數或setter來設置,而不需要反思。

編輯 - 基於您的更新 - 錯誤表示setDataType被模擬調用,但模擬器並沒有期待它被調用。也許你的班級正在調用它兩次,也許它是不按順序調用的,或者用你沒有想到的參數來調用它(儘管我希望這種情況下的錯誤會有所不同)。

+0

更正了這個問題,仍然有類似問題 – Marcin 2012-04-04 13:06:03

+0

確定錯誤是一樣的嗎? – hvgotcodes 2012-04-04 13:08:33

+0

編輯過的代碼和錯誤,thx! – Marcin 2012-04-04 13:09:38

相關問題