2017-10-21 9 views
0

私はPowerMockitoを使用してhttp呼び出しをモックしようとしていますが、機能に問題があります。 パスに特定の文字列が含まれているかどうかを確認してから、モックオブジェクトを返します。powermockが動作していません

Response res = client.target(theMovieDbURL) 
         .path("/3/genre/movie/list") 
         .queryParam("api_key", apiKey) 
         .request() 
         .buildGet() 
         .invoke(); 

私はからanyString()にモックを変更する場合:

import static com.mscharhag.oleaster.runner.StaticRunnerSupport.*; 
import static org.mockito.Matchers.*; 
import static org.mockito.internal.verification.VerificationModeFactory.times; 
import static org.powermock.api.mockito.PowerMockito.*; 
private static <T> void mockResponse(Class<T> type, T response, String pathContains) throws Exception 
{ 
    mockStatic(ClientBuilder.class); 
    Client client = mock(Client.class); 
    when(ClientBuilder.class, "newClient").thenReturn(client); 
    WebTarget webTarget = mock(WebTarget.class); 
    when(client.target(anyString())).thenReturn(webTarget); 

    //This is what doesn't work 
    when(webTarget.path(contains(pathContains))).thenReturn(webTarget); 

    when(webTarget.queryParam(any(), any())).thenReturn(webTarget); 
    Invocation.Builder invocationBuilder = mock(Invocation.Builder.class); 
    when(webTarget.request()).thenReturn(invocationBuilder); 
    Invocation invocation = mock(Invocation.class); 
    when(invocationBuilder.buildGet()).thenReturn(invocation); 

    Response res = mock(Response.class); 
    when(invocation.invoke()).thenReturn(res); 
    when(res.readEntity(type)).thenReturn(response); 
} 

mockResponse(GenreList.class, new GenreList(new Genre(0, "g")), "genre"); 

問題は私がHTTP呼び出しを行うにしようとしていますnullポインタを取得することです: は、だから私は、次の機能を持っていますそれは魅力のように機能しますが、私は異なるパスに対して異なる応答をする必要があるので、私はanyString()のままにすることはできません。私もeq()に変更しようとしましたが、どちらもうまくいきません。

私はここで何が間違っていますか?私のGradleから

:非答えの

testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.6.6' 
testCompile group: 'org.powermock', name: 'powermock-api-mockito', version: '1.6.6' 
testCompile group: 'org.powermock', name: 'powermock-module-junit4-rule', version: '1.6.6' 
+0

テストの模擬準備の部分を入力してください。あなたが共有しているコードに 'mockResponse'を呼び出すことはありません。 –

+0

@AlehMaksimovichそれは今存在しています:) – munHunger

+0

私はあなたが間違った 'を含む'を使用している可能性があるという唯一のアイデアです。静的インポートセクションを追加できますか? –

答えて

0

より:あなたはここで間違ったウサギの穴を下っています。

事である:試験の目的は、特定製造コードがテストを覆うようになっているという要件を実現することを保証することです。他に何もない。

先頭へ:多くの異なる側面を処理できる1つのコードに対して、複数の単純で直接的なテストを優先します。

意味:あなたが行くとあなたが(含まれているものを、様々な異なる可能性があります

when(webTarget.path(contains(pathContains))).thenReturn(webTarget); 

を使用して起動していない)が表示される場合があります。あなたが何らかの形でテストコードの中に巧妙な「ビジネスロジック」を表現するつもり:代わりに、むしろ明示的に言い換えれば

when(webTarget.path(contains(A))).thenReturn(webTargetA); 

...

when(webTarget.path(contains(B))).thenReturn(webTargetB); 

を言うn個のテストを持っています。あなたはそれを "スマート"にしたいと思っています。それをしないでください。その代わりに、のように、という特定の設定を作成して、という1つのというものをテストするテストコードを書くことに集中します。

まだ言い換えれば

パラメータ特定の戻り値を提供するために、テストコードではありません必要があるはずです。 は、プロダクションコードに表示されるセットアップ(およびそれによってパス)を定義するためです。あるテストではパスAを、別のテストではパスBを取るように指示します。そして、薄い空気の中で論理が消えてしまったら、精巧にしたいと思っています。

関連する問題