web-dev-qa-db-ja.com

Mockitoマッチャー:パラメーターリストのクラスタイプのマッチング

私はEclipseを使用して、Java、SpringのRestTemplate、およびMockitoを使用しています。 Springの残りのテンプレートをモックしようとしています。モックしているメソッドの最後のパラメーターはクラス型です。以下は、関数のシグネチャです。

public <T> ResponseEntity<T> exchange(URI url,
                                  HttpMethod method,
                                  HttpEntity<?> requestEntity,
                                  Class<T> responseType)
                       throws RestClientException

このメソッドをモックする最初の試みは次のとおりです。

//given restTemplate returns exception
when(restTemplate.exchange(isA(URI.class), eq(HttpMethod.POST), isA(HttpEntity.class), eq(Long.class))).thenThrow(new RestClientException(EXCEPTION_MESSAGE));

ただし、このコード行はEclipseから次のエラーを生成します。

The method exchange(URI, HttpMethod, HttpEntity<?>, Class<T>) in the type RestTemplate is not applicable for the arguments (URI, HttpMethod, HttpEntity, Class<Long>)

次に、Eclipseは、最後のパラメーターを「クラス」キャストでキャストすることを提案しますが、「クラス」または他のタイプにキャストすると機能しないようです。

私はこれに関するヘルプをオンラインで探していましたが、要求されたパラメーターがクラス型であるという事実に困惑しているようです。

私がこれまで見てきた答えは、主にジェネリックコレクションに関連しています。ここでの助けは大歓迎です。

9
piper1970

理解した。

呼び出されたメソッドはパラメーター化されたメソッドでしたが、マッチャー引数からパラメータータイプを推測できませんでした(最後の引数はクラスタイプでした)。

明示的な呼び出しを行う

when(restTemplate.<Long>exchange(isA(URI.class),eq(HttpMethod.POST),isA(HttpEntity.class), eq(Long.class))).thenThrow(new RestClientException(EXCEPTION_MESSAGE));

私の問題を修正しました。

8
piper1970

以下のコードスニペットは私のために働いた。リクエストエンティティには、isA()の代わりにany()を使用しました。

PowerMockito
    .when(restTemplate.exchange(
            Matchers.isA(URI.class),
            Matchers.eq(HttpMethod.POST),
            Matchers.<HttpEntity<?>> any(),
            Matchers.eq(Long.class)))
    .thenThrow(new RestClientException(EXCEPTION_MESSAGE));
0
kswaughs