[SPRING] 제네릭과 모치토 일치
SPRING제네릭과 모치토 일치
Spring Rest의 restTemplate.exchange 메서드를 조롱하려고합니다.
동일한 테스트에서 리턴 유형에 의해서만 다른 호출이 여러 개 있습니다.
내가 만든 조롱을하는 방법은 다음과 같습니다.
먼저
// Original method
restTemplate.exchange(UrlMap.SEARCH + '?' + searchDocsForm.toQueryParams(),
HttpMethod.GET, null, new ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>() {
})
// Mock
when(restTemplate.exchange(any(String.class), any(HttpMethod.class), any(), Matchers.<ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>>any())).thenReturn(
new ResponseEntity<>(searchResultsDTO, HttpStatus.OK));
둘째
// Original method
restTemplate.exchange(UrlMap.ALL_DOCUS_TOPICS,
HttpMethod.GET, null, new ParameterizedTypeReference<List<SelectItem>>() {
}).getBody();
// Mock
when(restTemplate.exchange(any(String.class), any(HttpMethod.class), any(), Matchers.<ParameterizedTypeReference<List<SelectItem>>>any())).thenReturn(
new ResponseEntity<>(selectItems, HttpStatus.OK));
ParameterizedTypeReference의 일반 매개 변수는 모의에 의해 고려되지 않고 마지막으로 정의 된 모의가 모의에 우선합니다.
그것을 작동시키는 어떤 방법이 있습니까?
해결법
-
==============================
1.Mockito는 제네릭 자체를 매칭하는 데는 좋지 않지만 일반적인 경우보다 솔루션이 훨씬 쉽습니다.
Mockito는 제네릭 자체를 매칭하는 데는 좋지 않지만 일반적인 경우보다 솔루션이 훨씬 쉽습니다.
너를 바꿔라.
Matchers.<ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>>any())
와:
eq(new ParameterizedTypeReference<SearchResultsDTO<SolrDocumentDTO>>() {}))
무엇보다도 Matchers.any ()는 형식과 일치하지 않으며 (Fock.class) 다양한 형식 (Mockito 1.x 현재)이 아닙니다. any ()는 null을 포함하여 모든 값과 일치합니다. 잘못된 유형 포함 :
( "미래의 주요 릴리즈"는 Mockito 2에서 가능할 것인데, isA 스타일의 타입 체크가 도입 될지도 모른다.) Mockito 커미터 Brice의 주석을 보라.)
generics는 exchange 및 thenReturn에 대한 올바른 매개 변수를 얻는 데 유용하지만 형식 지우기로 인해 해당 형식 정보가 CLOSE 파일에 들어 가지 않습니다. JVM은 말할 것도 없습니다. 인수의 유형을 선언하는 유일한 Matcher는 isA입니다. isA는 클래스 리터럴을 사용하며 매개 변수화 된 유형에 도움이되지 않습니다.
인수의 유형 및 매개 변수를 검사하는 사용자 정의 Matcher를 작성할 수 있습니다. 이러한 매개 변수는 지우는 대상이 아니지만 필요하지 않은 경우에만 사용할 수 있습니다.
타입 삭제는 ParameterizedTypeReference가 존재하는 전체적인 이유입니다 : 파라미터 화 된 타입이 지워지지 않는 서브 클래스에 제네릭 정보를 캡쳐합니다. 이 동일한 패턴은 Guava의 TypeToken 또는 Guice의 TypeLiteral에 사용됩니다. 이러한 모든 구현은 매개 변수화 된 유형을 인스턴스로 설명합니다.
중요하게는, ParameterizedTypeReference- 지원 equals와 hashCode를 포함한 모든 매개 변수가 중요하므로 새로운 ParameterizedTypeReference > () {}는 인스턴스가 다르더라도 새로운 ParameterizedTypeReference > () {}와 동일합니다. (코드는 여기를 참조하십시오.)
동일한 매개 변수화 된 형식에 대한 참조가 동일하므로 Mockito의 eq 정규 표현식을 다른 참조와 함께 사용하면 문제가 없습니다.
from https://stackoverflow.com/questions/29670463/match-generics-with-mockito by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring : 런타임시 인터페이스 구현을 변경하는 방법 (0) | 2019.04.23 |
---|---|
[SPRING] RoboSpice는 OrmLite를 사용하여 JSON 배열을 유지합니다. (0) | 2019.04.23 |
[SPRING] Spring / Hibernate / JPA에서 PostgreSQL 함수 (저장 프로 시저)를 올바르게 호출하는 방법? (0) | 2019.04.23 |
[SPRING] 유니 코드 문자와 스프링 JavaMailSenderImpl, 리눅스에서 유니 코드 문자가 없습니다! (0) | 2019.04.23 |
[SPRING] AuthenticationCredentialsNotFoundException : 보안 컨텍스트에서 인증 개체를 찾을 수 없습니다. (0) | 2019.04.23 |