@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<String> response = restTemplate.getForEntity("someurl",String.class);
if(...)return true;
return false;
}
}发布于 2017-02-23 15:56:18
首先,您的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);
}
}如果此操作失败,并显示没有Spring,请粘贴有关RestTemplate版本的信息(Spring Boot?)您正在使用。
发布于 2017-02-23 17:00:04
我想你的意思是你想使用spring提供的RestTemplate,所以你应该在spring自动连接RestTemplate之后使用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);
}
}发布于 2021-03-22 22:01:53
这不是对你问题的回答,只是为了以防有人在2021年…遇到这个问题对于Spring Boot测试,您可能希望利用仅使用@RestClientTest测试REST切片的优势。这只会在默认情况下创建一个RestTemplateBuilder bean,如果您想要一个自动连接的RestTemplate,只需添加一点配置,如下所示。(示例是用Kotlin编写的,对于读者来说,使用Java仍然是一种练习。)
@AutoConfigureWebClient(registerRestTemplate = true)
@RestClientTest(Service::class)
class AdkClientTest @Autowired constructor(
private val mockRestServiceServer: MockRestServiceServer,
private val service: Service
) {
// …
}https://stackoverflow.com/questions/42409768
复制相似问题