我想使用mock测试,当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测试此代码的解决方案?
必须先在Change
对象上调用next
方法,然后才能调用任何其他方法,如wasAdded
。
assertTrue(argument.getValue().next());
assertTrue(argument.getValue().wasAdded());
文档源public abstract Boolean next()
转到下一个更改。在初始状态下是无效的,在调用其他方法之前需要调用next()。第一个next()调用将使该对象表示第一个更改。