0

javafx ObservableList が変更されたときにいくつかのイベントがトリガーされることを、mockito を使用してテストしたいと思います。

私はこのようにしようとしました:

@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に、まずオブジェクトでメソッドを呼び出す必要があります。ChangewasAdded

単体テスト

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

ドキュメンテーション

パブリック抽象ブール値 next()

次の変更に進みます。初期状態では無効で、他のメソッドを呼び出す前に next() を呼び出す必要があります。最初の next() 呼び出しにより、このオブジェクトが最初の変更を表すようになります。

ソース

于 2013-03-05T11:31:37.623 に答える