当使用MockRestServiceServer和andExpect
进行测试时
mockServer.expect(requestTo("/hotels/42")).andExpect(method(HttpMethod.GET)) .andRespond(withSuccess("{ \“id\:\"42\",\"name\”:\“假日客栈”},MediaType.APPLICATION_JSON);
如果发现意外行为,则测试失败,
例如,如果将no further requests expected: HTTP
发送到意外的URL,则为
我的无花果:
@SpringBootApplication(scanBasePackages = { "..." })
public class MyConfig extends SpringBootServletInitializer {
我的考试课
@ContextConfiguration( classes = {MyConfig.class})
@ActiveProfiles("local")
@WebAppConfiguration
public class My Test extends AbstractTestNGSpringContextTests {
@Autowired
@InjectMocks
private ServiceUnderMock serviceUnderMock;
private AutoCloseable closeable;
@BeforeClass
public void initMocks() {
closeable = MockitoAnnotations.openMocks(this);
mockServer = MockRestServiceServer.bindTo(restTemplate).ignoreExpectOrder(true).build();
}
@AfterClass
public void releaseMocks() throws Exception {
closeable.close();
}
@Autowired
private RestTemplate restTemplate;
private MockRestServiceServer mockServer;
@Test
public void test() {
try {
mockServer.expect(ExpectedCount.min(1),
requestTo(new URI("https://www.google.com")))
.andExpect(method(HttpMethod.GET));
} catch (URISyntaxException e) {
Assert.fail("failed to create mock");
}
serviceUnderMock.doSomething();
}
那么为什么我们需要添加mockServer.verify()
在测试结束时,请使用test ()来确保实际执行所有预期的请求。
发布于 2021-12-27 09:33:31
MockRestServiceServer
的思想是允许您模拟外部服务器,这样在测试期间RestTemplate
实际上不需要向实际的服务器发送请求。相反,它只是将请求发送到这个MockRestServiceServer
(假设它是一种内存中的服务器),它将返回相应请求的配置模拟响应。
您必须在测试之前配置MockRestServiceServer
将接收的所有预期请求及其相应的响应。
因此,基本上有两件事需要验证,那就是:
RestTemplate
发送的每个请求,应该在MockRestServiceServer
中为该请求配置一个模拟响应。MockRestServiceServer
上接收的所有请求,RestTemplate应该真正发送所有这些预期请求。(1)每当RestTemplate
发出请求时,将自动验证。您提到的异常no further requests expected: HTTP
是因为它失败了(1) (即忘记在MockRestServiceServer
中存根这个请求)
(2)不会自动核实。您必须手动调用MockRestServiceServer.verify()
才能验证它。
举个例子:
mockServer.expect(requestTo(new URI("https://www.yahoo.com")))
.andExpect(method(HttpMethod.GET)).andRespond(withSuccess());
mockServer.expect(requestTo(new URI("https://www.google.com")))
.andExpect(method(HttpMethod.GET)).andRespond(withSuccess());
mockServer.expect(requestTo(new URI("https://www.stackoverflow.com")))
.andExpect(method(HttpMethod.GET)).andRespond(withSuccess());
restTemplate.getForEntity("https://www.yahoo.com", String.class);
restTemplate.getForEntity("https://www.google.com", String.class);
如果没有mockServer.verify()
,测试仍然可以通过,尽管RestTemplate
不会将请求发送给https://www.stackoverflow.com
,而MockServer将被接收。
但是使用mockServer.verify()
,它可以检查这一点,因此无法通过测试。
https://stackoverflow.com/questions/70247286
复制