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

我有MockRestServiceServer在服務中模擬restTemplete。但它總是失敗。它顯示錯誤爲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版本)。

一旦你有了它,那麼這兩個RestTemplates:你的Service bean中的一個和注入到FeatureFlipperManagerTest中的一個將是相同的,並且可以使用MockRestServiceServer進行測試。

編輯 - 更加明確:

修改您Service類:

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

和測試類:

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

如果失敗,除了說是有沒有RestTemplate bean現在請粘貼關於您使用的Spring(Spring Boot?)版本的信息。

+0

我想你的評論是正確的,但我不知道如何解決我的問題。如果我不能創建restTemplate bean。還有什麼我可以做嘲笑restTemplete?實際上我只需要嘲笑一個致電的迴應。無論如何要做到這一點? – c2340878

0

我想你的意思是你想要使用由Spring提供的RestTemplate,所以你應該在Spring自動裝配RestTemplate之後創建服務器。我認爲你可以這樣做:

@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