我有一個Foo
類是SUT和Bar
類,這是它的合作者。 Foo
在Bar
上調用run(List<Object> values)
,將「expectedList
」作爲參數。然後,Foo
將爲此List
添加幾個元素,以使其狀態與調用run()
時的狀態不同。這是我的測試案例。Mockito可以在方法調用時根據它們的值驗證參數嗎?
@Test
public void testFoo() {
Bar collaborator = spy(new Bar());
Foo sut = new Foo(collaborator);
verify(collaborator).run(expectedList);
}
注意,合作者實際上是一個間諜對象,而不是模仿。此測試用例將失敗,因爲即使使用等於expectedList
的參數調用run()
,它也會被修改,因爲它的當前值不再等於expectedList
。然而,這是它應該工作的方式,所以我想知道是否有方法讓Mockito在調用方法時存儲參數的快照,並根據這些值而不是最新的值對其進行驗證。
是的,大衛是對的。由於Mockito API的製作方式,不可能使用相同的參數引用來驗證多個調用。 EasyMock可以這樣做,因爲它在生產代碼運行之前有一個期望階段。無論如何,我不是使用'Answer',而是使用'ArgurmentCaptor'並在該列表的最後狀態中寫入一個或多個斷言,即使用FEST-Assert' assertThat(captor.getValue())。contains(「A」,「B 「).contains(」T「,」U「);' – Brice 2012-02-01 13:33:09
@Brice - 這與Michael Wiles的方法有什麼不同? – 2012-02-01 20:28:13
它不是。這只是實現測試目的的一種不同方式。因爲大多數時候你並不需要檢查中間參數,而只是發生了一些相互作用和最終結果。雖然我必須說,如果湯姆有具體的要求,然後同意這不會幫助他,但在這種情況下,我會避免我的生產代碼中的可變對象。感覺兩個協作者和消息之間的消息應該永遠是不可變的。 – Brice 2012-02-02 15:15:16