2017-02-23 23 views
4
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); 
    } 

私はrestclientを含むサービスの簡単なテストをテストしようとしました。それは私がRestTemplateをモックしていないように見える。コードが実際のデータを偽のものではないように見える。誰もがこれで私を助けることができます。このようJava SpringでRestTemplateをモックする方法は?

サービスそのものますルックス:

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; 
    } 
} 

答えて

4

問題は、isEnabledに新しいRestTemplateを作成していることです。これは2つの理由から間違っています。新しいものを作成しているので、それを気にすることができない、もう1つは要求ごとに新しいオブジェクトを作成しないことです。 RestTemplateはスレッドセーフなので、多くのスレッドで使用されているサービスクラスメンバになる可能性があります。

このような何かにあなたのサービスクラスを変更し

:今、あなたのRestTemplateはあなたが正しく二つの方法のうちの1つを介して模擬することができますクラスのメンバとなっていることを

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; 
    } 
} 

。 1つは、@InjectMockを使用して注入するか、テストから呼び出したセッターメソッドを使用します。

あなたのコードで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(), 
       Matchers.any(Class.class) 
       )) 
       .thenReturn(responseEntity); 
     boolean res = service.isEnabled("something"); 
     Assert.assertEquals(res, false); 
    } 

いくつかの変更を加えました。まず、new RestTemplate()new Service()を削除しました。あなたはmockitoがあなたのためにそれらを作成させるべきです。 @Mock@Spyで注釈を付けることで、Mockitoがそれらを作成し、さらに重要なことに、serviceオブジェクトにモックを挿入するようにします。

3

Spring MVCののテストフレームワークは、RESTfulなサービスコードをテストするユニットのクラスMockRestServiceServerを提供してきました。

ここには、tutorialが使用されています。

+0

私はチュートリアルを試みましたが、うまくいきません。 http://stackoverflow.com/questions/37781982/mocking-a-rest-call-with-mockrestserviceserver – c2340878

+0

https://github.com/jeffsheets/MockRestServiceServerExample –

0

@Autowiredを使用する場合は、MockRestServiceServerを使用できます。 以下はサンプルです。

@Service 
public class Service{ 
    @Autowired 
    private RestTemplate restTemplate; 

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

@Serviceは自動的にオブジェクトを作成するために@Autowiredを使用する必要があります。

+0

私は試みましたが、restTemplateがnullであるというエラーを返します。そして、私はrestTemplate beanを注入できないようです。それをテストするために他に何かできますか?私はRestTempleteの反応を嘲笑する必要があります。 – c2340878

+0

申し訳ありませんが、私はクラスに重要なアノテーションを入れていませんでした。私の答えをもう一度見てください。 – hiroyukik

関連する問題