使用mockito捕获javafx Change事件会抛出IllegalStateException

时间:2013-03-05 09:39:11

标签: javafx-2 mockito

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

1 个答案:

答案 0 :(得分:2)

您必须先在next对象上调用Change方法,然后才能调用wasAdded之类的任何其他方法。

单元测试

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

<强>文档

  

public abstract boolean next()

     
    

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

  

Source