如何使用MockRestServiceServer模拟RestTemplet?

@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 。 任何人都可以让我知道我没有做对的地方。

服务本身看起来像这样:

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

首先,您的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 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?)的信息。

我认为你的意思是你想使用Spring提供的RestTemplate,所以你应该在Spring自动assemblyRestTemplate之后创建Server。 我想你可以这样做:

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