我想使用mockito进行测试,在修改javafx ObservableList时会触发某些事件。
我试图这样做:
@Test
public void handleListChanged() throws Exception {
// [given]
ObservableList<String> list = FXCollections.observableArrayList();
ListChangeListener<String> listener = mock(ListChangeListener.class);
list.addListener(listener);
// [when]
list.add("test");
// [then]
ArgumentCaptor<Change> argument = ArgumentCaptor.forClass(Change.class);
verify(listener).onChanged(argument.capture());
assertTrue(argument.getValue().wasAdded());
}
在最后一行加注IllegalStateException
:
java.lang.IllegalStateException
at com.sun.javafx.collections.NonIterableChange.checkState(NonIterableChange.java:101)
at com.sun.javafx.collections.NonIterableChange.getPermutation(NonIterableChange.java:81)
at javafx.collections.ListChangeListener$Change.wasPermutated(ListChangeListener.java:156)
at javafx.collections.ListChangeListener$Change.wasAdded(ListChangeListener.java:165)
at FXCollectionsTest.handleListChanged(FXCollectionsTest.java:28
wasAdded()方法的文档警告,如果此更改处于初始状态“,则可以抛出IllegalArgumentException
”,但我不理解。
为什么我的代码无效?
是否有使用mockito测试此代码的解决方案?
答案 0 :(得分:2)
您必须先在next
对象上调用Change
方法,然后才能调用wasAdded
之类的任何其他方法。
单元测试
assertTrue(argument.getValue().next());
assertTrue(argument.getValue().wasAdded());
<强>文档强>
public abstract boolean next()
转到下一个更改。在初始状态无效时,需要在调用其他方法之前调用next()。第一个next()调用将使该对象代表第一个更改。