2017-02-23 109 views
0
@RunWith(MockitoJUnitRunner.class) 
public class FeatureFlipperManagerTest { 
    @Autowired 
    RestTemplate restTemplate = new RestTemplate(); 
    @Autowired 
    Service service = new Service(); 
    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 

    @Test 
    public void test() throws Exception { 
     mockServer.expect(requestTo(Mockito.anyString())) 
       .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON)); 
     boolean res = service.isEnabled("xxx"); 
     mockServer.verify(); 
     Assert.assertEquals(true, res); 
    } 
} 

サービスでmock restTempleteを使用するMockRestServiceServerがあります。しかし、それは常に失敗します。エラーはjava.lang.AssertionError: Further request(s) expected 0 out of 1 were executedと表示されます。いずれにせよ、私はそれが正しいことをしていない場所を知らせることができました。このようMockRestServiceServerでRestTempletをモックする方法は?

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

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

答えて

0

まず、あなたのServiceクラスは、すべてのリクエストに応じてRestTemplateの新しいインスタンスを作成します。私はそれがどれほど悪い習慣であるかを十分に強調することはできないRestTemplate型のBeanを作成し、Service beanに挿入します(これは、使用しているSpring MVCのバージョンに応じて既に作成されている可能性が高いです)。

これを取得したら、Serviceビーンの1つとFeatureFlipperManagerTestに注入された残りの2つのRestTemplatesが同じになり、MockRestServiceServerのテストが可能になります。

EDIT - より明確にするために:これがあるという例外で失敗した場合

@RunWith(MockitoJUnitRunner.class) 
public class FeatureFlipperManagerTest { 
    @Autowired 
    RestTemplate restTemplate; 

    @Autowired 
    Service service; 

    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 

    @Test 
    public void test() throws Exception { 
     mockServer.expect(requestTo(Mockito.anyString())) 
       .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON)); 
     boolean res = service.isEnabled("xxx"); 
     mockServer.verify(); 
     Assert.assertEquals(true, res); 
    } 
} 

@Component 
public class Service { 

    private RestTemplate restTemplate; 

    @Autowired 
    public Service(RestTemplate restTemplate) { 
     this.restTemplate = restTemplate; 
    } 

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

とあなたのテストクラス:

がにあなたのServiceクラスを変更RestTemplate beanが存在する場合は、使用しているSpring(Spring Boot?)のバージョンに関する情報を貼り付けてください。

+0

私は自分の問題を解決する方法がわかりませんが、私はあなたのコメントが正しいと思います。 restTemplate beanを作成できない場合restTempleteを模倣するために私ができることは他にありますか?実際にはgetコールの応答を嘲笑するだけです。これを行うためにとにかくありますか? – c2340878

0

あなたはSpringで提供されているRestTemplateを使用したいと思うので、SpringをRestowateした後にcreateServerを作成してください。私はあなたが次のようにそれをすることができると思います:

@RunWith(MockitoJUnitRunner.class) 
public class FeatureFlipperManagerTest { 
    @Autowired 
    RestTemplate restTemplate; 

    Service service; 
    MockRestServiceServer mockServer; 

    @Before 
    public void init() { 
     service = new Service(); 
     service.setRestTemplate(restTemplate); 
     // If you have autowired restTemplate in Service, you can just autowired the service 
     mockServer = MockRestServiceServer.createServer(restTemplate); 
    } 

    @Test 
    public void test() throws Exception { 
     mockServer.expect(requestTo(Mockito.anyString())) 
       .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON)); 
     boolean res = service.isEnabled("xxx"); 
     mockServer.verify(); 
     Assert.assertEquals(true, res); 
    } 
} 
+0

setRestTemplate(restTemplate)というメソッドが見つかりません。どうして? – c2340878

関連する問題