0

我想使用 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());
}

bu anIllegalStateException在最后一行加注:

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 测试此代码的解决方案?

4

1 回答 1

2

您必须next先在Change对象上调用该方法,然后才能调用任何其他方法,例如wasAdded.

单元测试

assertTrue(argument.getValue().next());
assertTrue(argument.getValue().wasAdded());

文档

公共抽象布尔下一个()

转到下一个更改。在初始状态下是无效的,需要在调用其他方法之前调用 next()。第一次 next() 调用将使该对象代表第一次更改。

来源

于 2013-03-05T11:31:37.623 回答