2011-06-08 72 views
2

我有一個類接收工廠作爲參數在構造函數中調用。它必須在那裏被調用,因爲對象在可以被使用之前應該被完全初始化。例如:如何使用easymock在構造函數上模擬方法調用?

class MyClass { 

    private Foo foo; 

    MyClass(FooFactory fooFactory, Bar bar) { 
    this.foo = fooFactory.newFoo(bar); 
    } 
} 

Foo的實例無法直接傳遞給構造函數,因此請考慮這是對問題的限制。 MyClass的不能使用EasyMock的,因爲fooFactory是,這不是在設置初始化一個模擬測試:

private MyClass myClass; 

    public void setUp() { 
    FooFactory fooFactory = mock(fooFactory); 
    Bar bar = new Bar(); 
    myClass = new MyClass(fooFactory, bar) 
    } 

所以當安裝程序被調用,在構造函數中調用了fooFactory.newFoo(bar)將失敗,一個IllegalStateException,因爲沒有這樣的期望已經確定。

問題是,你怎麼可以在構造函數中模擬方法調用?

+1

爲什麼不能在setUp()方法中設置fooFactory的期望值? – artbristol 2011-06-08 17:18:45

+1

由於構造函數在replay()之前調用fooFactory.newFoo(bar),所以它會被調用並拋出異常。如果您在setUp中調用replay(),則不能在其他測試中嘲笑其他任何東西。 – peninha 2011-06-08 17:21:51

回答

3

您可以EasyMock.reset(fooFactory)setUp之後MyClass被創建。

+0

也許我不明白你的意思,但這是行不通的。這裏的問題不是重置模擬,而是在調用重放()之前使其工作。 – peninha 2011-06-08 18:33:36

+3

我認爲他所說的是你可以重放模擬,調用你的構造函數,然後重新設置你的模擬來使用它,就好像你沒有調用重放一樣。關於重置的文檔不是很清楚。 – 2011-06-08 18:39:27

+1

@peninha它適合我。 'reset'將模擬狀態返回到創建後的相同狀態。你將記錄'fooFactory.newFoo()','重放'它的行爲,調用'MyClass'構造函數,'verify'和'reset'使它可用於實際的測試方法。 – pingw33n 2011-06-08 19:21:24

相關問題