3

モック化されたクラスのさまざまな動作について、クラスの動作を検証できるテストを作成する必要があります。同じメソッドに対して複数の動作をサポートするには、同じ TestClass でクラスを複数回モックする必要があります。

JMockItを使用することは可能ですか?

これが私が欲しいものの例です。これは、テストするメイン クラスとそのテストです。

public class MyClass {

    private Foo fooObj = null;

    public setfooObj(Foo obj) {
        fooObj = obj;
    }

    public boolean process() {
        // uses fooObj.getName() to process 
    }
}

public class MyClassTest {

    @MockClass(realClass = mypackage.Foo.class)
    public static class MockFoo {

        @Mock
        public static boolean getName() {
            return "test";
        }
    }

    @Test
    public void validateProcessing() {
        MyClass testObj = new MyClass();
        assertEquals(false, testObj.process);
    }
}

ここで、異なる値を返すtestObj.process()ときのメソッドの動作を確認したいと思います。MockFoo.getName()最初のアサーションでは、その値を「テスト」(モック関数によって返される) として使用したいのですが、次のアサーションでは、別の値でチェックしたいと考えています。

4

2 に答える 2

2

これは簡単に解決でき、同じクラスを 2 回モックする必要はありません。異なる呼び出しで同じモック メソッドから異なる値を返すには、「Expectations API」を使用している場合は、2 つ (またはそれ以上) の連続した戻り値を記録するだけです。「モックアップ API」を使用している場合は、「Invocation inv」タイプの最初のパラメーターをモック メソッドに追加し、「inv.getInvocationIndex()」を使用して、返される値を確認します (他のオプションほど適切ではありませんが、機能します)。大丈夫)。

より多くのドキュメントと例については、JMockit プロジェクト サイト、または完全なディストリビューションの「jmockit/www」ディレクトリの下をご覧ください。

于 2012-05-15T20:08:36.667 に答える
0

はい、 @Mocked の代わりに@Injectableアノテーションを使用すると、各モックが個別のインスタンスになります。これらのインスタンスでさまざまな期待/検証を行うことができます。

チュートリアルの例:

@Test
public void concatenateInputStreams(
  @Injectable final InputStream input1,
  @Injectable final InputStream input2)
{
  new Expectations() {{
     input1.read(); returns(1, 2, -1);
     input2.read(); returns(3, -1);
  }};

  InputStream concatenatedInput = new ConcatenatingInputStream(input1, input2);
  byte[] buf = new byte[3];
  concatenatedInput.read(buf);

  assertArrayEquals(new byte[] {1, 2, 3}, buf);
}
于 2012-06-19T09:12:12.810 に答える