Java SpringでローカルRestTemplateをモックする方法は?質問する

Java SpringでローカルRestTemplateをモックする方法は?質問する
public class ServiceTest {
    @Mock
    RestTemplate restTemplate = new RestTemplate();
    @InjectMocks
    Service service = new Service();
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                Matchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }

私は REST クライアントを含むサービスの簡単なテストを試してみました。どうやら、Mock がRestTemplateうまく実行されていないようです。コードは、Mock データではなく実際のデータを取得しているようです。どなたか、この件について手伝っていただけますか。

サービス自体は次のようになります。

public class Service{
    public boolean isEnabled(String xxx) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}

ベストアンサー1

問題は、isEnabled新しい RestTemplate を作成していることです。これは 2 つの理由で間違っています。1 つは、新しいものを作成しているため、モックを作成できないこと、もう 1 つは、リクエストごとに新しいオブジェクトを作成しないようにすることです。RestTemplate はスレッド セーフであるため、サービス クラスのメンバーになり、多くのスレッドで使用できます。

サービス クラスを次のように変更します。

public class Service{

    RestTemplate restTemplate = new RestTemplate();

    public boolean isEnabled(String xxx) {
        ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
        if(...)return true;
        return false;
    }
}

RestTemplate がクラス メンバーになったので、2 つの方法のいずれかを使用して適切にモックできるようになりました。1 つは、 を使用して注入する@InjectMockか、テストから呼び出す setter メソッドを使用する方法です。

コード内で InjectMock を使用しているので、それを使用できます。

@RunWith(MockitoJUnitRunner.class) 
public class ServiceTest {
    @Mock
    RestTemplate restTemplate;
    @InjectMocks
    @Spy
    Service service;
    ResponseEntity responseEntity = mock(ResponseEntity.class);

    @Test
    public void test() throws Exception {
        Mockito.when(restTemplate.getForEntity(
                Mockito.anyString(),
                ArgumentMatchers.any(Class.class)
                ))
                .thenReturn(responseEntity);
        boolean res = service.isEnabled("something");
        Assert.assertEquals(res, false);
    }

いくつか変更を加えたことに注意してください。まず、 と を削除しましたnew RestTemplate()new Service()これらは mockito で作成する必要があります。 と で注釈を付けることで、@MockMockito@Spyがこれらを作成し、さらに重要なことに、オブジェクトにモックを挿入することが保証されますservice

おすすめ記事