38

以下のコードをテストするための模擬リストを作成したいと思います。

 for (String history : list) {
        //code here
    }

これが私の実装です:

public static List<String> createList(List<String> mockedList) {

    List<String> list = mock(List.class);
    Iterator<String> iterHistory = mock(Iterator.class);

    OngoingStubbing<Boolean> osBoolean = when(iterHistory.hasNext());
    OngoingStubbing<String> osHistory = when(iterHistory.next());

    for (String history : mockedList) {

        osBoolean = osBoolean.thenReturn(true);
        osHistory = osHistory.thenReturn(history);
    }
    osBoolean = osBoolean.thenReturn(false);

    when(list.iterator()).thenReturn(iterHistory);

    return list;
}

ただし、テストを実行すると、次の行で例外がスローされます。

OngoingStubbing<DyActionHistory> osHistory = when(iterHistory.next());

詳細については:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at org.powermock.api.mockito.PowerMockito.when(PowerMockito.java:495)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!

どうすれば修正できますか?ありがとう

4

3 に答える 3

44

OK、これは悪いことです。リストをモックしないでください。代わりに、リスト内の個々のオブジェクトをモックします。これを行う方法については、Mockito: for ループでループされる arraylist のモックを参照してください。

また、なぜ PowerMock を使用しているのですか? PowerMock を必要とすることは何もしていないようです。

しかし、問題の本当の原因はwhen、スタブ化を完了する前に、2 つの異なるオブジェクトを使用していることです。を呼び出しwhen、スタブしようとしているメソッド呼び出しを提供する場合、Mockito または PowerMock で次に行うことは、そのメソッドが呼び出されたときに何が起こるかを指定することです。つまり、そのthenReturn部分を実行します。を呼び出すたびwhenに、 を 1 回だけ呼び出してからthenReturn、 をさらに呼び出す必要がありますwhenwhenを呼び出さずに を2 回呼び出しthenReturnました。これはあなたのエラーです。

于 2013-08-29T18:00:12.203 に答える
13

リストをモックして反復処理するときは、常に次のようなものを使用します。

@Spy
private List<Object> parts = new ArrayList<>();
于 2016-04-07T15:52:13.963 に答える