2011-08-30 123 views
1

我使用easymock進行了單元測試,結果未在答案對象中設置。模擬對象被傳遞給測試主題,並在處理完成後返回模擬對象的相同引用,但不包含結果集。模擬未保存狀態

的代碼應該使畫面更清晰

@Test 
public void test() { 
DomainInterface mock = EasyMock.create("mock", DomainInterface.class); 
Subject subject = new Subject(); 
subject.setDomainInterface(mock); 

final DomainInterface domain = subject.process(); 

assertEquals("Not the same instance", mock, domain); 

final String expected = "VALID"; 
final String answer = domain.getAnswer(); 

assertEquals("Not the expected answer", expected, answer); 
} 

什麼Subject.process正在做的是一對夫婦的驗證,然後設置「有效」的答案,但執行失敗,並斷言錯誤消息

java.lang.AssertionError: Not the expected answer expected:<VALID> but was:<null> 

主題對象有一個類型爲DomainInterface的私有成員,其中設置了模擬的引用,爲什麼答案在截斷之前不會被保留?

在此先感謝

+1

很難說沒有看到其他的代碼。我建議你提取足夠的內容,使其成爲一個簡短但完整的程序,然後發佈。 –

回答

2

我剛纔注意到您聲稱被返回相同的模擬。你也永遠不會打電話replay()把模擬放入重播模式 - 如果你有,它會拋出一個例外,只要Subject試圖調用任何方法。

我的猜測是,你期待模擬記住調用setAnswergetAnswer被稱爲具有相同的結果答覆 - 但嘲諷不喜歡的工作。您應該可能預計致電setAnswer("VALID")。事情是這樣的:

public void test() { 
    DomainInterface mock = EasyMock.create("mock", DomainInterface.class); 

    // Expect that the subject will call setAnswer with an argument of "VALID" 
    mock.setAnswer("VALID"); 

    EasyMock.replay(); 

    Subject subject = new Subject(); 
    subject.setDomainInterface(mock); 

    DomainInterface domain = subject.process();  
    assertEquals("Not the same instance", mock, domain); 

    // No need to assert the result of calling getAnswer - we've already asserted 
    // that setAnswer will be called. 
} 

個人而言,我已經變成了許多測試手寫假貨的粉絲 - 嘲笑是偉大的互動測試(又名協議測試),但在這種情況下,它看起來像一個簡單的假冒也可以做到......或者可能是一種混合物,它可以剔除簡單的位(屬性),但允許模擬需要交互測試的位。

+0

謝謝你,正如你所指出的,我從來沒有爲這個模擬而重複過(),並且誤解了這個模擬的工作方式。現在它正在工作。 – iapazmino