java - 在自定义 Spring 端点的单元测试期间 GET“连接被拒绝”上的 I/O 错误命中 Spring 控制器中的默认 swagger 端点
问题描述
我有一个来自 gradle 依赖的端点,可以说它/v3/doc
我需要公开一个端点,让我们调用它,/v1/info
它在内部点击 /v3/doc,按摩,一些出来的数据,然后将该数据块返回给调用 /v1/info 的任何人
我为它编写了代码(为了简单起见,下面我省略了按摩部分),但是单元测试会抛出测试执行期间描述的错误。
我的端点如下所示:
@RestController
public class MyController {
@GetMapping("v1/info")
public @ResponseBody SomePojo swag(HttpServletRequest request) {
String s = retrieve(request
.getRequestURL()
.toString()
.split("v1")[0] // get the base URL and tack on what i need
.concat("v3/doc")
);
return new Gson().fromJson(s, SomePojo.class)
}
private String retrieve(String url) {
return new RestTemplate()
.getForEntity(url, String.class)
.getBody();
}
}
单元测试看起来像:
@WebMvcTest(MyController.class)
@ActiveProfiles(profiles = "local")
public class MyControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testEndpoint() throws Exception {
mockMvc.perform(get("/v1/info")
.contentType(MediaType.APPLICATION_JSON)
.characterEncoding("utf-8"))
.andExpect(status().isOk());
}
}
错误看起来像:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost/v3/doc": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
我想知道它是否与端口有关?因为当我在 8001 上运行应用程序时,我可以点击/v3/doc
并且/v1/info
没有问题。但正如您在单元测试运行时看到的那样,没有端口,只有 localhost。我不认为这很重要。我必须创建某种假的 mvc 存根吗?
解决方案
您的测试上下文仅在@WebMvcTest(MyController.class)
. 这意味着在这种情况下,没有其他端点以及应用程序服务器也没有运行。当您调用 restTemplate 时,它会失败。
如果您想测试,您应该将 RestTemplate 创建移到方法之外并制作@Autowirible
例如。在您可以轻松地在测试中模拟它之后。
或者在您的第三方服务始终可用的情况下,您会因为端口未定义而出现错误,但对于单元测试而言,它在概念上看起来不正确。
推荐阅读
- vue.js - 如何更改 Vue.js 项目中所有 ApexCharts 的字体系列?
- css - 下一部分与第一部分重叠,即使使用 z-index
- flutter - 如何在颤动中设置http超时
- python-3.x - Django webp转换器标签static_webp不起作用
- json - 使用 newtonsoft 反序列化 JSON
- azure-devops - Azure Pipelines 仅获取最新文件
- scheme - 尝试打开使用 raco (macOS) 创建的可执行文件时出现签名错误
- regex - RegEx - 返回 URL 文本字符串右侧的模式
- java - 在edittext android中用于邮政编码(字母数字+数字)的标准Java/Kotlin正则表达式
- vue.js - 来自 sessionStorage 的对象在 vuejs / vuex 中没有反应