0
public void testCreate() throws ApplicationException {
    DutyDrawback drawback = new DutyDrawback();
    drawback.setSerialNumber("TEST123");
    drawback.setSnProcessInd("Y");
    drawback.setMediaNumber("TEST111");
    drawback.setMnProcessInd("Y");
    drawback.setConfirmedInd("Y");
    drawback.setResponseCode("1");
    drawback.setResponseMsg("MSG");
    drawback.setLastChangedUser("USER");
    drawback.setLastChangedDate(new Date(System.currentTimeMillis()));

    mockILogger.expects(atLeastOnce()).method("informationalEvent");
    Logger.setMockLogger((ILogger) mockILogger.proxy());

    // Set up the statement expectations
    Mock mockStatement = mock(PreparedStatement.class);
    mockStatement.expects(atLeastOnce()).method("setString");
    mockStatement.expects(once()).method("executeUpdate").will(returnValue(1));

    Mock mockStatement1 = mock(PreparedStatement.class);
    mockStatement1.expects(atLeastOnce()).method("setString");
    mockStatement1.expects(once()).method("executeUpdate").will(returnValue(1));

    // Set up the connection expectations
    mockConnection.expects(once()).method("setAutoCommit");
    mockConnection.expects(once()).method("commit");
    mockConnection.expects(once()).method("prepareStatement").will(returnValue(mockStatement1.proxy()));
    mockConnection.expects(once()).method("prepareStatement").will(returnValue(mockStatement.proxy()));

    TVSUtils.setMockConnection((Connection) mockConnection.proxy());
    DutyDrawbackDAO drawbackDAO = new DutyDrawbackDAO();
    int count = drawbackDAO.create(drawback);
    assertEquals(2, count);
}

次のトレースを取得しています。

org.jmock.core.DynamicMockError:mockPreparedStatement:予期しない呼び出し呼び出し:mockPreparedStatement.executeUpdate()許可:少なくとも1回は予期され、呼び出されました:setString、一度は無効であり、呼び出されました:executeUpdate、returns <1>

at org.jmock.core.AbstractDynamicMock.mockInvocation(AbstractDynamicMock.java:96)
at org.jmock.core.CoreMock.invoke(CoreMock.java:39)
at $Proxy2.executeUpdate(Unknown Source)
at com.cat.tvs.dao.DutyDrawbackDAO.create(DutyDrawbackDAO.java:102)
at com.cat.tvs.dao.DutyDrawbackDAOTest.testCreate(DutyDrawbackDAOTest.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:85)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:58)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:60)
at java.lang.reflect.Method.invoke(Method.java:391)
at junit.framework.TestCase.runTest(TestCase.java:164)
at org.jmock.core.VerifyingTestCase.runBare(VerifyingTestCase.java:39)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

ここで何が間違っているのかわかりませんか?

ありがとう。

4

1 に答える 1

3

まず、jmock1 を使用しているようですが、jmock2 に移行することを検討してください。

失敗は、予期しないときに executeUpdate() を呼び出していることを示しています。あなたはそれを複数回呼び出していますか?

最後に、何年も前にその方法を示す論文を書いたにもかかわらず、私は通常、JDBC に対する模擬テストを作成しないことをお勧めします。「自分が所有するモック型のみ」について話す理由はいくつかありますが、そのうちの 1 つは、モック テストがサード パーティの実装が変更されないことを前提としていることです。JDBC については、実際のデータベースの小さなインスタンスに対して実行する統合テストを作成することをお勧めします。

于 2012-09-28T09:59:13.150 に答える