「模擬」只是一個空虛擬對象,它模擬「真實」對象的行爲。如果您定義類似when(mocked.add(2,3)).thenReturn(5);
的行爲,那麼當您收到這些確切的值時,您可以具體說明該模擬該做什麼。
mocked.add(6,7)
將在此時返回0
,因爲你還沒有定義其行爲的價值,因此使用默認值。因此,如果您想要涵蓋所有可能的輸入,可以使用@MaciejKowalski發佈的解決方案,並使用像Mockito.any(Integer.class)
這樣的通用匹配器。
我仍然不清楚如何正確處理嘲笑。 Mock是一種向被測系統提供外部依賴的方法,無需設置整個依賴關係樹。通常不會調用該類中的真正方法。這就是when(mocked.add(2,3)).thenReturn(5);
的意思。它告訴模擬行爲像真正的依賴關係,沒有真正的依賴。
一個例子可能是這樣的:
public class TestClass {
private ExternalDependency dep;
public void setDep(ExternalDependency dep) {
this.dep = dep;
}
public int calculate() {
return 5 + dep.doStuff();
}
}
public class ExternalDependency {
public int doStuff() {
return 3;
}
}
現在,在您的測試代碼,你可以使用嘲笑這樣的:
@Test
public void should_use_external_dependency() {
// Aquire a mocked object of the class
ExternalDependency mockedDep = Mockito.mock(ExternalDependency.class);
// Define its behaviour
Mockito.when(mockedDep.doStuff()).thenReturn(20);
TestClass sut = new TestClass();
sut.setDep(mockedDep);
// should return 25, since we've defined the mocks behaviour to return 20
Assert.assertEquals(25, sut.calculate());
}
如果sut.calculate()
被調用時,在ExternalDependency
的方法不應該是真的稱爲,它委託給嘲弄的存根對象。但是,如果你要撥打的真正類的真正方法,你可以使用一個間諜,而不是與Mockito.spy(ExternalDependency.class)
或者你可以做到這一點與when(mockedDep.doStuff()).thenCallRealMethod();
你的問題是沒有意義的我。你明確地說mockito「當參數是2和3,然後返回5」,然後你傳遞6和7 ...爲什麼mockito應用該規則,如果前提條件不滿足? – Tom