【问题标题】:Spring Test MockMvc perform request on external URLSpring Test MockMvc 对外部 URL 执行请求
【发布时间】:2016-04-03 21:12:03
【问题描述】:

我正在尝试对当前上下文之外的 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 类是一个巨大的痛苦。

【问题讨论】:

  • 你为什么期望 MockMvc 可以在外部 URL 上工作?
  • 为什么不呢?它只是一个测试工具,对吧?首先要正确测试我的控制器,我应该从外部网络服务中获取一些信息。我不认为这是非常罕见的情况。
  • 它是一个测试工具,非常具体地模拟了 Servlet 堆栈的一小部分独立的部分。任何地方都没有涉及到 HTTP 客户端,而只是 HTTP 服务器的一部分。你不妨说,既然 Selenium 是一个测试工具,它应该修改数据库架构。
  • 请注意,如果您发现问题的其中一个答案可以接受,请随时accept it

标签: java spring spring-mvc testing spring-test


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    Spring Reference Manual中所述,

    Spring MVC 测试框架为测试提供一流的支持 使用可与 JUnit 一起使用的流式 API 的 Spring MVC 代码, TestNG 或任何其他测试框架。它建立在 Servlet API 之上 来自 spring-test 模块的模拟对象,因此不使用 正在运行 Servlet 容器。

    最后一句话说明了这一点:Spring MVC 测试确实使用正在运行的 Servlet 容器。事实上,它不能与正在运行的 Servlet 容器或任何类型的实际服务器(本地或远程)一起使用。

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

    【讨论】:

    • 感谢您的解释。
    • 仅供参考:我添加了关于 REST Assured 的注释。
    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2014-03-15
    相关资源
    最近更新 更多