2016-11-29 4 views
0

을 제네릭과 익명의 클래스를 처리 그것은 그루터기처럼 보이는나는 다음과 같은 방법에 대한 Powermockito를 사용하여 단위 테스트를 작성하는 것을 시도하고있다 Mockito

Wanted but not invoked: 
jWTGenerator.createJWT(
    {[email protected]} 
); 

난 항상이에 대해 "널 (null)"얻을대로 작동하지 않는 - 항상 말을 실패 수 행 -

Map<String, Object> map = mapper.readValue(json, new TypeReference<Map<String, Object>>() { 
     }); // Here passing TypeReference annonymously 

TypeReference 클래스의 익명의 인스턴스화 때문입니까?

답변

3

예, 익명의 내부 클래스 때문입니다.

PowerMockito.whenNew(TypeReference.class).withNoArguments() 
    .thenReturn(mockTypeReference); 

을하지만 실제로 만드는 것은 TypeReference 아닌 TypeReference 자체를 확장 익명의 클래스입니다 : 특히, new TypeReference에 전화를 대체 할 PowerMockito에게이에 가고

Map<String, Object> map = mapper.readValue(
    json, new TypeReference<Map<String, Object>>() {}); 

특히 까다 롭습니다. 내 일반적인 조언은 여기에 TypeReference와 같은 "don't mock data objects"이 있는데, 이는 반사에 크게 의존하는 토큰/값/데이터 객체가 아니기 때문에, Guice와 Guava의 사촌들도 그렇습니다. doesn't support equals; 테스트에서 자신의 실제 TypeReference를 만들고 클래스의 실제 값과 eq을 비교할 수는 없습니다.

당신은 아직도 모의 TypeReference,하지만 당신은 또한 당신이 그것에 대하여 주장하는 방식을 조정해야한다

: 잭슨 당신이 할 수있는 경우

  • 이 명명 된 동등한 익명 TypeReference 서브 클래스를 추출하고 사용 isA을 입력하여 유형을 확인하십시오.
  • 보이는 상수에 TypeReference를 추출하고 그 참조 평등을 확인하십시오.
  • Captor을 사용하고 나중에 반영을 사용하여 TypeReference의 제네릭 유형을 확인하십시오.
  • 기술적 인 측면에서 Matchers 클래스 인 Mockito.<TypeReference<Map<String, Object>>>any()으로 전환하거나 최신 버전의 Mockito에서는 ArgumentMatchers으로 전환하십시오. 이 값은 어쨌든 변경되지 않으므로 PowerMock을 설득하는 것보다 실제적으로 시스템 및 테스트가 수표 무시로 인해 읽기 쉽고 강력해질 수 있습니다.
  • 당신이 할 수있는 곳이라면 어디에서든지 실제 의존성을 사용하고 구현이 올바른 방식으로 올바른 공동 작업자와 상호 작용하는 것이 아니라 함수가 작동 하는지를 확인하는 것이 이상적입니다. 어쨌든 당신이 일하는 기능이 있습니다. 맞습니까?
+0

감사합니다. Mockito로 전환했습니다. >> any()가 작동합니다. – Saurabh