仅在测试子集中使用 MockRestServiceServer
Using MockRestServiceServer only in subset of tests
我想使用 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
中读取我的服务正常运行所必需的属性。
Spring Boot 提供了一种方便的方法来测试使用 Spring 的 RestTemplate
和 @RestClientTest
的客户端 classes。
使用此注释,您将获得一个 Spring 测试上下文,它只包含相关的 bean 而不是您的整个应用程序上下文(这是您当前使用 @SpringBootTest
获得的内容)。
MockRestServiceServer
也是此上下文的一部分,并且 RestTemplate
配置为以它为目标。
基本测试设置如下所示:
@RestClientTest(CommentFetcher.class)
class UserClientTest {
@Autowired
private CommentFetcher userClient;
@Autowired
private MockRestServiceServer mockRestServiceServer;
// ...
}
剩下的就是存根 HTTP 方法调用,然后在您的 class 测试中调用该方法(在您的情况下为 commentFetcher.fetchData();
)。
如果您想详细了解如何使用 @RestClientTest
来测试您的 RestTemplate
使用情况,请参阅此 article。
我想使用 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
中读取我的服务正常运行所必需的属性。
Spring Boot 提供了一种方便的方法来测试使用 Spring 的 RestTemplate
和 @RestClientTest
的客户端 classes。
使用此注释,您将获得一个 Spring 测试上下文,它只包含相关的 bean 而不是您的整个应用程序上下文(这是您当前使用 @SpringBootTest
获得的内容)。
MockRestServiceServer
也是此上下文的一部分,并且 RestTemplate
配置为以它为目标。
基本测试设置如下所示:
@RestClientTest(CommentFetcher.class)
class UserClientTest {
@Autowired
private CommentFetcher userClient;
@Autowired
private MockRestServiceServer mockRestServiceServer;
// ...
}
剩下的就是存根 HTTP 方法调用,然后在您的 class 测试中调用该方法(在您的情况下为 commentFetcher.fetchData();
)。
如果您想详细了解如何使用 @RestClientTest
来测试您的 RestTemplate
使用情况,请参阅此 article。