4

mockitoでは、モックオブジェクトのメソッドに渡されたオブジェクトのフィールドに設定された以前の値をキャプチャすることは可能ですか?たとえば、テスト中のメソッドはこれを実行します

    public void methodUnderTest(){
    Person person = new Person();
    person.setAge(5);
    someObject.setPerson(person);

     ...

    person.setAge(6); 
    someObject.setPerson(person);
    }

私が知りたかったのは、someObject をモックした場合、someObject が単一のオブジェクト「person」に対して setPerson を 2 回実行したが、setPerson が発生したときにオブジェクトの age の値が異なることを確認できるかどうかです。ArgumentCaptor を使用してみましたが、同じオブジェクトを渡したので、最後の年齢だけを取得できました。

    ArgumentCaptor<Integer> arg = ArgumentCaptor.forClass(Integer.class);
    verify(mockObject).setPerson(arg.capture());
    List<Integer> captureList = arg.getAllValues();
    captureList.get(0).getAge(); // returns 6
    captureList.get(1).getAge(); // returns 6

私もやってみました

    InOrder in = inOrder(mockObject);
    in.verify(mockObject).setPerson(arg.capture());
    assertEquals(5, arg.getValue().getAge()); //fails
4

3 に答える 3

4

残念ながら、 . ではそれを行うことはできませんArgumentCaptor。キャプターは引数への参照のみを保存します。この場合、同じオブジェクトpersonへの参照が 2 回格納されます。

メソッドが呼び出されるAnswerたびに適切なチェックを実行するには、 を使用してみてください。setPerson

このmockitoの問題は、あなたがやろうとしていることに関連しています。

于 2012-08-16T09:50:36.697 に答える
0

Mockitoでは不可能だと思います。TDDアプローチで最初にテストを記述し、その後にコードを記述することで、コードを「ユニットテスト可能」またははるかに優れたものに書き直すことができます。

ただし、何らかの理由でコードを変更できない場合は、PowerMock機能を使用できます。たとえばPowerMockito.whenNew、のモックを提供できますA。ただし、このアプローチはお勧めしません。

于 2012-08-16T10:01:37.663 に答える
0

できませんか?

verify(mockedList, times(1)).setPerson(eq(5));
verify(mockedList, times(2)).setPerson(eq(6));

私がmockitoを使用してからしばらく経ったので、それは正しい構文だと思います。

それとも、アサーション以外の理由で値を取得する必要がありますか?

于 2012-08-16T09:42:36.827 に答える