2016-12-06 13 views
0

私はMyRestServiceクラスのメソッド次しているだけのローカル変数を使用した試験方法は:Mockito:

public Address getOfficeLocation(String id){ 
    RestClient restClient = new RestClient(tokenOauthUrl); 
    String url = String.format(officeAddress, id); 
    JSONObject jsonObject = restClient.get(url, null, credentials); 
    return AddressParser.parseOfficeAddress(jsonObject); 
} 

私が呼ばれたrestClient.getしたいと思います。私は次のテストを書いた:

@Mock 
private MyRestService myService; 
@Mock 
private RestClient restClient; 

@Test 
public void getOfficeLocationTest(){ 
    myService.getOfficeLocation(any(String.class)); 
    Mockito.verify(restClient, Mockito.times(1)).get(any(String.class), any(MultivaluedMap.class), any(Credentials.class)); 
} 

私はこれが間違ったアプローチだと思います。私はテストの失敗を得る:Wanted but not invoked: Actually, there were zero interactions with this mock.

私のメソッドをテスト可能にするには?

+2

あなたは依存性の注入を可能にするために、あなたの 'MyRestService'コードを変更する必要があるだろうにRestClientを嘲笑注入します - 私たちの' RestClient'は依存性があります。 –

+0

モック 'restClient'を' myService'モックに注入しましたか?いずれにしても、あなたはブラックボックステストの原則に違反しています。 'RestClient'、imhoのための別のテストを書いたほうがいいです。 – vikingsteve

+0

あなたのコードでは、Restuckの新しいインスタンスを作成したので、あなたの模擬バージョンのRestClientは使用されません – user7

答えて

1

あなたのSUTはこの

class YourClass { 
    @Inject 
    private RestClient restClient; //Injecting RestClient 

    public Address getOfficeLocation(String id){ 
     String url = String.format(officeAddress, id); 
     JSONObject jsonObject = restClient.get(url, null, credentials); 
     return AddressParser.parseOfficeAddress(jsonObject); 
    } 
} 

のようなものであるべきで、あなたのテストコードは、私はMyRestServiceテスト(SUT)の下で、あなたのシステムなので、それは嘲笑されるべきではないと信じてい

@Mock 
private MyRestService myService; 

を持っています代わりに新しいオブジェクトを作成する必要があります

@InjectMocks 
private MyRestService myService; 

これは基本的に、MyRestService

+0

DI/IoCにはテストと同様に他の利点がありますが、*必須* 。 –

+0

@DaveNewton私は同意します。しかし、OPのテストコードから、それ(RestClient)は、複数のコメントに記載されているように、 – user7

+0

はい、注入されるオブジェクトです。しかし、Mockitoをそのまま使用してコードをテストすることはできます。 –