MockHttpServletRequest 忽略设置字段,我该如何解决这个问题?

MockHttpServletRequest ignoring set fields, how do I get around this?

我正在尝试为 Tomcat 应用程序测试 servlet 过滤器。为此,我使用了 Spring.

提供的 MockHttpServletRequest

我是这样设置的:

MockHttpServletRequest request = new MockHttpServletRequest();
request.setMethod("POST");
request.setRemoteHost("mycompany.com");
request.setRequestURI("/myapp.php");
request.setSecure(true);

但是当我执行以下操作时:

System.out.println(request.getRequestURL());

产生:http://localhost/myapp.php。另一方面,如果我明确请求我设置的其中一个字段,例如:

System.out.println(request.getRemoteHost());

我得到:mycompany.com

这是怎么回事?我怎样才能让 getRequestURL 产生我真正想要的东西:https://mycompany.com/myapp.php

您正在创建一个 MockHttpServletRequest,它表示服务器上 运行 的 servlet 收到的请求。

MockHttpServletRequest#getRemoteHost() (really of ServletRequest) 的 javadoc 声明

Returns the fully qualified name of the client or the last proxy that sent the request.

因此,您使用 setRemoteHost 设置的是发出请求的客户端的 hostname/ip,而不是接收请求的服务器的主机名。

你会想要MockHttpServletRequest#setServerName(String)

request.setServerName("mycompany.com");

Sotirios 关于 serverNameremoteHost 的说法是正确的;然而,这种改变只会让你部分到达那里。

以下将实现您的目标:

MockHttpServletRequest request = new MockHttpServletRequest();
request.setScheme("https");
request.setServerName("mycompany.com");
request.setServerPort(443);
request.setRequestURI("/myapp.php");

System.out.println(request.getRequestURL());
// Prints: https://mycompany.com/myapp.php

此致,

山姆