首页 > 解决方案 > 在自定义 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 存根吗?

标签: javaspringunit-testingspring-testmockmvc

解决方案


您的测试上下文仅在@WebMvcTest(MyController.class). 这意味着在这种情况下,没有其他端点以及应用程序服务器也没有运行。当您调用 restTemplate 时,它​​会失败。

如果您想测试,您应该将 RestTemplate 创建移到方法之外并制作@Autowirible例如。在您可以轻松地在测试中模拟它之后。

或者在您的第三方服务始终可用的情况下,您会因为端口未定义而出现错误,但对于单元测试而言,它在概念上看起来不正确。


推荐阅读