복붙노트

[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. ==============================

    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 정규 표현식을 다른 참조와 함께 사용하면 문제가 없습니다.

  2. from https://stackoverflow.com/questions/29670463/match-generics-with-mockito by cc-by-sa and MIT license