【问题标题】:Using MockRestServiceServer only in subset of tests仅在测试子集中使用 MockRestServiceServer
【发布时间】:2021-01-06 21:21:36
【问题描述】:

我想使用 MockRestServiceServer 测试来自我的服务的传出 HTTP 调用。我使用以下代码让它工作:

@SpringBootTest
class CommentFetcherTest {

@Autowired
RestTemplate restTemplate;

@Autowired
CommentFetcher commentFetcher;


@Test
public void shouldCallExternalService(){

    MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);

    mockServer.expect(ExpectedCount.once(), requestTo("/test/endpoint")).andExpect(method(HttpMethod.GET));

    //when
    commentFetcher.fetchData();

    mockServer.verify();

}
}

但是我遇到的问题是 RestTemplate 是套件中所有测试之间共享的 bean,这使得无法进一步运行应该调用外部服务的集成测试。这导致:

java.lang.AssertionError: No further requests expected

如何仅将MockRestServiceServer 用于测试子集? 我无法通过@Autowired 摆脱依赖注入并在测试中构建我的服务,例如

RestTemplate restTemplate = new RestTemplate();
CommentFetcher commentFetcher = new CommentFetcher(restTemplate);

因为这不会从application.properties 读取我的服务正常运行所必需的属性。

【问题讨论】:

  • 不确定我是否完全理解这里的大局,但是您是否可以在集成测试课程中自动连接TestRestTemplate? BR

标签: spring-boot spring-test mockrestserviceserver


【解决方案1】:

Spring Boot 提供了一种方便的方法来测试使用 Spring 的 RestTemplate 使用 @RestClientTest 的客户端类。

使用此注解,您将获得一个仅包含相关 bean 而非整个应用程序上下文的 Spring 测试上下文(这是您当前使用 @SpringBootTest 获得的)。

MockRestServiceServer 也是此上下文的一部分,RestTemplate 配置为针对它。

基本测试设置如下所示:

@RestClientTest(CommentFetcher.class)
class UserClientTest {
 
  @Autowired
  private CommentFetcher userClient;
 
  @Autowired
  private MockRestServiceServer mockRestServiceServer;
 
  // ...
 
 
}

剩下的就是存根 HTTP 方法调用,然后在您的测试类上调用该方法(在您的情况下为 commentFetcher.fetchData();)。

如果您想了解更多关于如何使用@RestClientTest 来测试您的RestTemplate 使用情况,请参阅此article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2019-02-21
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多