我有一個簡單的Bar
,做一些字符串的操作:驗證的Mockito與列表改變
public interface Bar {
void action(List<String> strings);
}
然後我Foo
這是測試。它隨着時間的推移構建了一個字符串列表,然後最終使用Bar
來處理它們。處理完後,隊列被清除。
public class Foo {
private final Bar bar;
private final List<String> strings;
public Foo(Bar bar) {
this.bar = bar;
this.strings = new ArrayList<>();
}
public void addStrings(String... strings) {
Collections.addAll(this.strings, strings);
}
public void processStrings() {
bar.action(strings);
strings.clear();
}
}
我試圖驗證Bar.action
被預期的字符串調用。但是,Mockito沒有檢測到真實的調用與實際參數,因爲調用Bar.action
後被使用的爲的列表被清除。
我可能做錯了什麼,但是這對我來說就像是一個臭蟲。這裏的測試:
@Test
public void shouldVerify() {
// Given
Bar bar = mock(Bar.class);
Foo foo = new Foo(bar);
foo.addStrings("Hello", "World");
foo.addStrings("!!!");
// When
foo.processStrings();
// Then
verify(bar).action(Arrays.asList("Hello", "World", "!!!"));
}
比較失敗:
預計:bar.action([你好,世界!]);
Actual:bar.action([]);
可以肯定的是,註釋掉strings.clear()
可以讓Mockito正確驗證。
我可以做一個新的列表解決這個問題傳遞給Bar
,如:
public void processStrings() {
bar.action(new ArrayList<>(strings));
strings.clear();
}