0

Log4j.error メソッドの呼び出し中に Throwable を含めると、アサーション エラーが発生します。@PreparateForTest ブロックに Logger.class、PrintWriter.class、AuthenticationException.class があります。Throwable を引数として渡さなければ、エラーは表示されません。

モックを正しく設定する際に何が欠けていますか?

    Caused by: java.lang.AssertionError: 
      Unexpected method call AuthenticationException.printStackTrace(java.io.PrintWriter@2c64e8ad):
            at org.junit.Assert.fail(Assert.java:93)
            at com.xxx.yy.security.client.ClientTest.authenticateFail(ClientTest.java:282)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:606)
            at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:66)
            at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)
            ... 23 more

JUnit テスト コード スニペットは次のとおりです。

    AuthenticationException mockAuthException = PowerMock
                        .createMock(AuthenticationException.class);
    PrintWriter mockPrintWriter = PowerMock
                        .createMock(PrintWriter.class);
    Logger mockLogger = PowerMock.createMock(Logger.class);
    String message = "blah";
    mockLogger.error(message, mockAuthException);
    EasyMock.expectLastCall();

    mockAuthException.printStackTrace(mockPrintWriter);
    EasyMock.expectLastCall();

問題の原因となっているコード スニペットは次のとおりです。

    try{
    .
    .
    }catch (AuthenticationException ex) {
        LOGGER.error("SOME MESSAGE HERE", ex);
        throw ex;
    }
4

2 に答える 2

1

次のように Unexpected method call error解決できます。

AuthenticationException mockAuthException = EasyMock.createNiceMock(AuthenticationException.class);
PrintWriter mockPrintWriter = EasyMock.createNiceMock(PrintWriter.class);
Logger mockLogger = EasyMock.createNiceMock(Logger.class);
String message = "blah";
mockLogger.error(message, mockAuthException);
EasyMock.expectLastCall();

mockAuthException.printStackTrace(mockPrintWriter);
EasyMock.expectLastCall();

ここでの変更点は、powermock の代わりに easymock を使用し、通常のモックの代わりに niceMock を作成することです。

createMock(..)メソッドは厳密であり、メソッドが内部で呼び出されているかどうかを識別できませんが、このチェックを使用するとcreateNiceMock(..)、UnexpectedMethodCall エラーは発生しません。

それが役に立てば幸い!

幸運を!

于 2015-01-04T04:59:05.303 に答える