Spring 测试 MockMvc 在外部执行请求 URL

Spring Test MockMvc perform request on external URL

我正在尝试在当前上下文之外对 URL 执行 POST 请求,看起来 Spring 无法理解它。

测试代码:

        String content = mvc
            .perform(post("http://some-external-url.com:8080/somepath)
                    .header("Authorization", authorization)
                    .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                    .param("username", username)
                    .param("password", password)
            .andExpect(status().isOk())
            .andReturn().getResponse().getContentAsString();

在当前环境下很有魅力。但是远程服务根本就达不到。似乎忽略了“http://some-external-url.com:8080”部分。

模拟创建代码:

mvc = MockMvcBuilders.webAppContextSetup(context).build();

有什么办法让它起作用吗?因为使用标准 Java HttpUrlConnection class 是一个巨大的痛苦。

没有。无法使 Spring MVC 测试框架与外部服务器(或与此相关的任何实际服务器)一起工作。

Spring Reference Manual

中所述

The Spring MVC Test framework provides first class support for testing Spring MVC code using a fluent API that can be used with JUnit, TestNG, or any other testing framework. It’s built on the Servlet API mock objects from the spring-test module and hence does not use a running Servlet container.

最后一句话说得很清楚:Spring MVC 测试 使用运行 Servlet 容器。事实上,它不能与 运行 Servlet 容器或任何类型的实际服务器(本地或远程)一起使用。

作为替代方案,如果您必须针对外部服务器进行测试,那么您可以考虑使用REST Assured而不是Spring MVC 测试那些特殊的案例。

您可以使用new RestTemplate().getForObject("http://some-external-url.com:8080/somepath", String.class)