2014-12-31 7 views
0

Log4j.error 메소드를 호출하는 동안 Throwable을 포함 할 때 어설 션 오류가 발생합니다. @PreparateForTest 블록에 Logger.class, PrintWriter.class, AuthenticationException.class가 있습니다. Throwable을 인수로 전달하지 않으면 오류가 표시되지 않습니다.Logger.error (String, Throwable) 호출시 EasyMock AssertionError

mock 설정이 잘못되었습니다.

Caused by: java.lang.AssertionError: 
     Unexpected method call AuthenticationException.printStackTrace([email protected]): 
      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; 
    } 

답변

0

LOGGER.error("SOME MESSAGE HERE", ex);

이 줄은 것으로 보인다 printStacktrace 방법은 ex입니다. 즉, AuthenticationException 유형. 당신이 그것을 조롱했기 때문에,이 호출이 발생할 때 객체 (모의, 기술적으로)가 행동해야한다고 행동을 말해야합니다.

당신은 떨어져 당신이 정말이 예외가 발생 될 것으로 예상 가정 nice mocks의 사용을 통해 코스의 verification 편안한 3 ​​개의 선택을 가지고 (귀하의 질문은 그것에 대해 조금 모호) :

  • 참조 LOGGER.error("SOME MESSAGE HERE", ex);을 기대할 수 있다면, 즉 을 조롱하십시오. LOGGERstatic 변수가 될 것으로 보인다,하지만 당신은 Powermock를 사용하는 것, 그래서 나는 당신이 그것을 조롱 어떤 문제가있을 거라고 생각하지 않지만, 당신이 LOGGER을 조롱 관심이있는 경우,

  • 에게 읽을 Easymock 당신 전에 (printStacktracevoid 방법 인) 이런 식으로에 기대를 배치하여 모의 객체 mockAuthExceptionprintStacktrace 메서드 호출을 발견 한 경우 응답 해야하는 방법 replay 모의 :

    mockAuthException.printStacktrace(); expectLastCall().andDoSomethingIfNeeded();

  • 절대적으로 필요한 경우가 아니면 AuthenticationException 유형을 조롱하지 마십시오. Stub 유형을 만들어 조롱하지 않아도되는 것처럼 보입니다. 여기

    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을 만드는 :

1

다음과 같이 해결 될 수있는 Unexpected method call error을 얻고있다.

createMock(..) 방법은 엄격하고 메소드가 내부적으로 호출하거나하지 않은 경우 식별 할 수없는,하지만 당신은 createNiceMock(..)를 사용할 때이 검사가 무시되고 당신은

가 도움이 희망 UnexpectedMethodCall 오류를 얻을하지 않습니다!

행운을 빈다.