2010-05-06 50 views
2

我試圖用EasyMock和TestNG編寫一些單元測試,並且遇到了問題。鑑於以下幾點:使用EasyMock測試參數值

void execute(Foo f) { 
    Bar b = new Bar() 
    b.setId(123); 
    f.setBar(b); 
} 

我試圖測試該欄的ID獲取以下列方式進行相應的設置:

@Test 
void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 

    execute(f); 

    Bar b = ?; // not sure what to do here 
    f.setBar(b); 
    f.expectLastCall(); 
} 

在我的測試,我不能就這麼叫f.getBar()和檢查它是否是因爲f是模擬對象。有什麼想法嗎?這是我想看看EasyMock v2.5增加andDelegateTo()andStubDelegateTo()

哦,只是爲了記錄... EasyMock的文檔打擊。

+0

我相信如果你創建的是同樣的酒吧,它會工作。你爲什麼不嘗試? – 2010-05-06 17:08:09

+0

我的理解是,這種方法更依賴Bar.equals()的實現,而不是執行我的execute()方法。雖然我認爲這會奏效,但似乎還有更好的辦法。 – fmpdmb 2010-05-06 17:17:48

+1

是的,你會斷言傳遞給模擬的酒吧實例等於你所期望的。如果你的Bar的'equals()'方法不足以滿足你想要測試的內容,或者在你的測試中測試比你關心的更多的字段,那麼捕獲是一個更好的選擇(儘管它提出了什麼Bar的問題。等於()是不夠的)。 – 2010-05-06 17:39:35

回答

8

啊哈!捕獲是關鍵。

@Test 
void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 

    Capture<Bar> capture = new Capture<Bar>(); 
    f.setBar(EasyMock.and(EasyMock.isA(Bar.class), EasyMock.capture(capture))); 
    execute(f); 

    Bar b = capture.getValue(); // same instance as that set inside execute() 
    Assert.assertEquals(b.getId(), ???); 
} 
+0

有關更詳細的解釋,請查看我的EasyMock教程(特別是第3部分):https:// turnlevel。 com/2013/05/28/easymock-fundamentals-3/ – fmpdmb 2014-03-04 20:22:25

0
f.setBar(EasyMock.isA(Bar.class)) 

這將確保setBar被調用時使用Bar類作爲參數。

0

我會構造一個對象,它是equal到我期望找回的那個。在這種情況下,我會創建一個new Bar並將它的ID設置爲123,依靠equals()hashCode()Bar的正確實現以及EasyMocks參數匹配器的默認行爲(對參數進行等同比較)。

@Test 
public void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 
    Bar expected = new Bar(); 
    expected.setId(123); 
    f.setBar(expected); 
    EasyMock.expectLastCall(); 
    EasyMock.replay(f); 

    execute(f); 

    EasyMock.verify(f); 
} 
+0

我認爲這更多的是對Bar的實現的測試,而不是你打算測試的方法。 – fmpdmb 2010-05-06 18:57:45

1

你試過嗎?`

final Bar bar = new Bar(); 
bar.setId(123); 
EasyMock.expect(f.getBar()).andAnswer(new IAnswer<Bar>() { 
    public Bar answer() {    
     return bar; 
    } 
}); 

我不知道在我的頭頂語法,但是這應該工作。