2013-08-05 2 views
6

정적 메서드 중 하나는 두 가지를 사용하고 있습니다. 그것은 일부 데이터를 리턴하지만 전달 된 인수 오브젝트를 수정합니다. 이 업데이트 된 인수 객체는 나중에 코드에서 사용됩니다.doAnswer for static methods - PowerMock

PowerMock을 사용하여 반환 동작을 조롱합니다.

입력 인수를 업데이트하는 두 번째 부분을 정의하려면 doAnswer 메소드를 정의하지만 작동하지 않습니다. 테스트하려는 메서드는 다음과 같습니다.

public void login() throws ConnectionException, AsyncApiException { 
    ConnectorConfig partnerConfig = new ConnectorConfig(); 

    //This call sets the value in one member variable 'serviceEndPoint in ParterConfig which is accessed later in this method only. 
    partnerConnection = Connector.newConnection(partnerConfig); 

    //partnerConfig.getServiceEndpoint is called. 

    PowerMockito.mockStatic(Connector.class); 
    when(Connector.newConnection(Mockito.any(ConnectorConfig.class))).thenReturn(partnerConnection); 

    PowerMockito.doAnswer(new Answer<Void>() { 
     @Override 
     public Void answer(InvocationOnMock invocation) { 
      ConnectorConfig config = (ConnectorConfig) invocation.getArguments()[0]; 
      config.setServiceEndpoint("service end point"); 
      return null; 
     } 
    }).when(Connector.newConnection(Mockito.any(ConnectorConfig.class))); 
}  

그러나 '위의 스텁이 감지되지 않았습니다.'라는 오류가 발생합니다. Connector은 타사 클래스이므로 해당 동작을 제어 할 수 없습니다.

어떤 제안이 잘못 될 수 있습니까?

답변

11
PowerMockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(Connector.newConnection(Mockito.any(ConnectorConfig.class))); 

when이 문제입니다. 정상 Mockito에서, 어떤 doAnswer/doReturn/등 호출을 사용하여, 당신과 같이, when로 외부 통화스텁하고있는 전화를 걸 수 있습니다

Mockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(yourMock).callVoidMethod(); 
//   ^^^^^^ 

PowerMockito 더 정적 메서드에 그 호출을 필요로 과 같이, in the next statement 일어날 다음 documentation I linked이 실제로 일치하지 않는

PowerMockito.doAnswer(new Answer<Void>() { 
    /* ... */ 
}).when(Connector.class); Connector.newConnection(/*...*/); 
//     ^^^^^^ 

주 - 문자 클래스가 서명 소용이 필요합니다 반면, 워드 프로세서, 제로 인수 when에 암시처럼 보인다 할 수 있는. 잠시 시간이 있다면 버그로 신고하는 것이 좋습니다.

필수 PSA :jury's still out on that one이지만 일반적으로 avoid mocking types you don't own 인 것이 좋습니다.

+0

doc 링크는 thnx입니다. 나는 그것을 내일 시도 할 것이다. – RandomQuestion

+0

이것은 효과가 있습니다. 나는 버그를 신청했다. 제목은 가리 키지 않지만 편집 할 수는 없습니다. https://code.google.com/p/powermock/issues/detail?id=452&can=4&q=javadoc – RandomQuestion