【问题标题】:Why mockServer.verify is needed in MockRestServiceServer为什么在 MockRestServiceServer 中需要 mockServer.verify
【发布时间】:2022-01-11 18:26:06
【问题描述】:

当使用MockRestServiceServerandExpect 进行测试时

mockServer.expect(requestTo("/hotels/42")).andExpect(method(HttpMethod.GET))
    .andRespond(withSuccess("{ \"id\" : \"42\", \"name\" : \"Holiday Inn\"}", 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()

在测试结束时使用 verify() 来确保所有预期的请求都被实际执行。

【问题讨论】:

  • 你能多加一点上下文吗?测试设置以及完整的异常/失败断言。
  • @rieckpil 添加了上下文
  • 您在课堂上使用了哪些 Spring Boot 测试注释?现在这有点令人困惑,因为您首先声明您正在使用mockServer.expect(requestTo("/hotels/42")),但随后在测试中您模拟了对 Google 的请求?你能澄清一下吗?
  • @rieckpil 酒店来自文档链接,添加了类注释

标签: java spring spring-boot spring-test mockserver


【解决方案1】:

MockRestServiceServer 的想法是它允许您模拟外部服务器,这样RestTemplate 在测试期间实际上不需要将请求发送到实际服务器。相反,它只是将请求发送到这个MockRestServiceServer(认为它是一种内存服务器),它会为相应的请求返回配置的模拟响应。

您必须在测试前配置MockRestServiceServer 将收到的所有预期请求及其相应的响应。

所以基本上有两件事需要验证:

  1. 对于RestTemplate 发送的每个请求,都应该在MockRestServiceServer 中为该请求配置一个模拟响应

  2. 对于在 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 没有将请求发送到预期会收到 MockServer 的 https://www.stackoverflow.com

但是使用 mockServer.verify() ,它可以检查并因此无法通过测试。

【讨论】:

    猜你喜欢
    • 2020-05-03
    • 2019-06-09
    • 2013-06-12
    • 2012-11-21
    • 2011-04-13
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多