Spring Boot测试中如何为单个用例禁用WireMock服务器?
解决单个测试停用WireMock的方案
有两种可靠的方法可以实现单个测试禁用WireMock且不影响其他测试,推荐优先使用第一种:
方法一:修改服务配置指向无效地址(推荐)
你的测试类中已经通过Mockito mock了ArticleServiceConfiguration,可以直接在目标测试方法中临时修改配置的服务地址为无效地址,让请求因无法连接抛出异常,模拟服务不可用场景,无需操作WireMock服务器。
步骤:
- 在测试类中注入mock的
ArticleServiceConfiguration实例:
@Autowired private ArticleServiceConfiguration articleServiceConfiguration;
- 修改目标测试方法的逻辑:
@Test public void saveArticleWhenServerIsUnavailable() { // 临时将服务地址改为不存在的无效地址 Mockito.when(articleServiceConfiguration.getUri()).thenReturn(URI.create("http://invalid-service:9999")); ArticleDto dto = new ArticleDto("Test Title", "Test Content", 1L); assertThrows(ServerUnavailableException.class, () -> articleService.saveArticle(dto)); // 恢复原配置,避免影响其他测试 Mockito.when(articleServiceConfiguration.getUri()).thenReturn(URI.create("http://article-service:8080")); }
这种方法不会改变WireMock的运行状态,对其他测试完全无影响,是最安全的方案。
方法二:直接启停WireMock服务器
如果必须停用WireMock服务器本身,可以注入WireMockServer实例,在测试方法中手动控制启停,测试完成后恢复。
步骤:
- 在测试类中注入
WireMockServer实例:
@Autowired private WireMockServer wireMockServer;
- 修改目标测试方法的逻辑:
@Test public void saveArticleWhenServerIsUnavailable() { // 停止WireMock服务器 wireMockServer.stop(); try { ArticleDto dto = new ArticleDto("Test Title", "Test Content", 1L); assertThrows(ServerUnavailableException.class, () -> articleService.saveArticle(dto)); } finally { // 必须重启WireMock,确保后续测试正常运行 wireMockServer.start(); } }
注意:这种方法需要确保在finally块中重启服务器,否则会导致后续所有依赖WireMock的测试失败。
内容的提问来源于stack exchange,提问作者Sergey Kazantsev
相关产品推荐
相关产品推荐

