下面您可以看到一個示例類WorkWithArrayList
。本課程有兩種方法removeFirstThree
和insertData
。 removeFirstThree
方法獲取List
作爲參數並對其進行修改並插入到數據庫中。在for
循環中,我展示了此修改,就好像它正在刪除Integer
的List
的第一個元素,並在每次迭代中插入數據。如何通過Mockito驗證方法是否以期望的參數(java.util.List作爲參數)調用
我想要實現的是驗證insertData
方法的參數。但verify
方法檢查只有第一個verify(workWithArrayList).insertData(expected);
聲明。
package test;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
public class MockitoVerifyWithArrayListTest {
private WorkWithArrayList workWithArrayList;
private List<Integer> actual;
private List<Integer> expected;
@Before
public void setUp() throws Exception {
workWithArrayList = spy(new WorkWithArrayList());
actual = new ArrayList<>();
actual.add(1);
actual.add(2);
actual.add(3);
actual.add(4);
actual.add(5);
actual.add(6);
expected = new ArrayList<>();
expected.add(1);
expected.add(2);
expected.add(3);
expected.add(4);
expected.add(5);
expected.add(6);
}
@Test
public void test() throws Exception {
workWithArrayList.removeFirstThree(actual);
expected.remove(0);
verify(workWithArrayList).insertData(expected);
expected.remove(0);
verify(workWithArrayList).insertData(expected);
expected.remove(0);
verify(workWithArrayList).insertData(expected);
}
public class WorkWithArrayList {
public void removeFirstThree(List<Integer> integers) {
for (int i = 0; i < 3; i++) {
integers.remove(0);
insertData(integers);
}
}
public void insertData(List<Integer> integers) {
}
}
}
當我運行這個測試,我用下面的錯誤面向:
Argument(s) are different! Wanted:
workWithArrayList.insertData(
[2, 3, 4, 5, 6]
);
-> at test.MockitoVerifyWithArrayListTest.test(MockitoVerifyWithArrayListTest.java:46)
Actual invocation has different arguments:
workWithArrayList.insertData(
[4, 5, 6]
);
-> at test.MockitoVerifyWithArrayListTest.test(MockitoVerifyWithArrayListTest.java:43)
編輯:如果我們看一下Mockito.verify
方法的javadoc,我們可以看到這一點:
參數傳遞的比較採用equals()
方法。
但變量actual
和expected
是相等的,即使我們刪除了第一個元素,它們也會保持相等。我很感興趣,爲什麼這個測試失敗了。