1

フレームワークは現在、アプリケーション内でわずかに使用されていますが、jmockit は初めてです。

サービス層の DAO をモックアウトしようとしています。期待値を使用して読み取りメソッドのオブジェクトを返す方法は理解していますが、作成メソッドを使用して作成されたオブジェクトをキャプチャして、それらをテストできるようにしたいと考えています。

どうすればいいですか?

たとえば、DAO には以下が含まれます。

public void create(Person person){
    //code to create person here.
}

モックアップして、このメソッドに入ってくる人をキャプチャして、後でテストで質問できるようにしたいと考えています。

フィードバックに基づいて、次を使用してテストを行いました...

@Mocked @NonStrict
private PaymentStubDAO mockPaymentStubDAO;

...

new Expectations() {
    {
    mockPaymentStubDAO.create((PaymentStub) any);
    returns(any);
    }
};

...

//set up the verifications
new Verifications() {{
  mockPaymentStubDAO.create((PaymentStub) any);
  forEachInvocation = new Object() {
     @SuppressWarnings("unused")
    void validate(PaymentStub stub) {
         assertEquals(1, (int)stub.getDaysJuror());
     }
  };

}};

実行すると、new Verifications() の行で次のエラーが表示されます。

java.lang.AssertionError: Missing 1 invocation to:
Object com.acs.gs.juror.dao.accounting.PaymentStubDAO#create(Object)
with arguments: null
on mock instance: $Impl_PaymentStubDAO@424f8ad5
    at com.acs.gs.juror.manager.accounting.impl.AccountingManagerImplTest$2.<init>(AccountingManagerImplTest.java:1925)
    at com.acs.gs.juror.manager.accounting.impl.AccountingManagerImplTest.testPayOverUnderLimit(AccountingManagerImplTest.java:1924)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: Missing invocations
    at com.acs.gs.juror.manager.accounting.impl.AccountingManagerImplTest$1.<init>(AccountingManagerImplTest.java:1859)
    at com.acs.gs.juror.manager.accounting.impl.AccountingManagerImplTest.testPayOverUnderLimit(AccountingManagerImplTest.java:1845)
    ... 12 more
4

2 に答える 2

2

Per the documentation:

 @Test
public void verifyExpectationWithArgumentValidatorForEachInvocation(
     final Collaborator  mock)
{
  // Inside tested code:
  new Collaborator().doSomething(true, new int[2], "test");

  new Verifications() {{
     mock.doSomething(anyBoolean, null, null);
     forEachInvocation = new Object()
     {
        void validate(Boolean b, int[] i, String s)
        {
           assertTrue(b);
           assertEquals(2, i.length);
           assertEquals("test", s);
        }
     };
  }};

}

Found at JMockit Docs

FYI, as I mentioned in your previous question Mockito makes this a lot easier in my opinion. Ask yourself if you are really locked down to JMockit.

于 2012-06-06T15:00:00.543 に答える
1

冗長な期待ブロックの行を除けばreturns(any)、サンプル テスト コード フラグメントに問題は見られません。ただし、エラーをスローする完全なテスト例を見ると役立ちます。

いずれにせよ、次のサンプル テストも機能するはずです。

@Test
public void createAPaymentStub(@Mocked final PaymentStubDAO mockPaymentStubDAO)
{
    // Executed somewhere inside the code under test:
    PaymentStub stub = new PaymentStub();
    stub.setDaysJuror(1);
    mockPaymentStubDAO.create(stub);

    new Verifications() {{
        mockPaymentStubDAO.create(with(new Delegate<PaymentStub>() {
           void validate(PaymentStub stub) {
               assertEquals(1, (int)stub.getDaysJuror());
           }
        }));
    }};
}

( any/anyXyzフィールドは、記録された/検証された期待値で引数マッチャーとして使用されることのみを意図しており、非メソッドreturns(...)の戻り値を記録することのみを目的としています。)void

または、Mockups API を使用することもできます。これは、この場合は少し単純です。

@Test
public void createAPaymentStub()
{
    PaymentStubDAO mockDAO = new MockUp<PaymentStubDAO>() {
        @Mock
        void create(PaymentStub stub) {
           assertEquals(1, (int)stub.getDaysJuror());
        }
    }.getMockInstance();

    // Executed somewhere inside the code under test:
    PaymentStub stub = new PaymentStub();
    stub.setDaysJuror(1);
    mockDAO.create(stub);
}
于 2012-06-06T17:51:35.840 に答える