1

次のコードがあるとします。

public class ClassToTest
{
    AnotherClass anotherClass;

    public void methodToTest( int x, int y )
    {
        int z = x + y
        anotherClass.receiveSomething( z );
    }
}

public class AnotherClass
{
    public void receiveSomething( int z ) {.. do something.. }  
}

変数 z の値についてアサーションを行いたいと考えています。リファクタリングせずにこれを行うにはどうすればよいですか? 変数 x、y、および z は、他の Java クラス型である可能性がありますが、簡単にするために「int」を使用しました。

4

1 に答える 1

3

次のように記述できます。もちろん、依存性注入とテスト方法は、現在の実装やテスト シナリオによって変わる可能性があります。

@RunWith(MockitoJUnitRunner.class)
public class ClassToTestTest {

    @Mock AnotherClass anotherClass;
    @InjectMocks ClassToTest classToTest;

    @Test public void ensure_that_value___Z___is_passed_to___AnotherClass() {
        classToTest.methodToTest(1, 2);

        verify(anotherClass).receiveSomething(eq(3));
    }
}

Mockito 1.9.5-rc1 を念頭に置いて書かれています。

また、eqマッチャーを使用する代わりにArgumentCaptor、値または値参照 (オブジェクトの場合) をキャプチャする を使用することもできます。キャプチャされた値に対して追加のアサーションを実行できます。たとえば、Truth または FEST-Assert を使用します。

これは次のようになります。

@RunWith(MockitoJUnitRunner.class)
public class ClassToTestTest {

    ...
    @Captor ArgumentCaptor<List<Z>> listCaptor

    @Test public void ensure_that_list_with_value___Z___is_passed_to___AnotherClass() {
        // given

        // when
        ...

        // then
        verify(anotherClass).receiveList(listCaptor.capture());
        assertThat(listCaptor.getValue()).contains(Z);
    }
}

乾杯、

于 2012-08-28T09:52:28.803 に答える