mockhttpservletrequestbuilder-如何更改httpservletrequest的remotehost的remoteaddress?

odopli94  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(410)

我正在尝试为集成测试创建模拟请求(@springboottest)。

//given     
MockHttpServletRequestBuilder requestBuilder = get("/users/register/user1");

我要检查的是这个请求的遥控器。在我的控制器中,我从httpservletrequest获取这个信息

HttpServletRequest request;
request.getRemoteHost();
request.getRemoteAddr();

不幸的是现在 getRemoteHost() 将始终返回localhost。
我想在模拟请求中将其更改为其他内容,例如:
远程主机: localhost --> mockhostdomain 远程地址: 127.0.0.1 --> 10.32.120.7 (有什么不同)
我找不到合适的方法。有可能吗?

wf82jlnq

wf82jlnq1#

我终于找到了解决办法:
https://techotom.wordpress.com/2014/11/12/mocking-remoteaddr-with-spring-mvc/
基本上用这个方法我们可以改变请求的每个参数。
因此,首先我们必须定义更改请求内容的方法:

private static RequestPostProcessor remoteHost(final String remoteHost){
    return request -> {
        request.setRemoteAddr(remoteHost);
        return request;
    };

而不是用方法 with(...)MockHttpServletRequestBuilder 对象我们必须注入这个方法的结果。

MockHttpServletRequestBuilder requestBuilder = get("/user/prop").
         .with(remoteHost("mockhostdomain.com"));
wtzytmuj

wtzytmuj2#

使用mockmvc,您可以执行以下操作:

Map<String, String> req = new HashMap<>();
//        req.put("")
        ObjectMapper mapper = new ObjectMapper();
        ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();
        java.lang.String requestJson = ow.writeValueAsString(req);

        String responseString = this.mockMvc.perform(post
                ("/authorization/activated")
                .with(request->{request.setRemoteAddr("192.168.0.2");return request;})
                .contentType(MediaType.APPLICATION_JSON)
                .content(requestJson)
                .header("Authorization", bear)
        .header("X-Device-Id","7fb0c4e49aec4c5a9a089d0c84f7078b"))
                .andReturn().getResponse().getContentAsString();
        System.out.println("[POST result]:" + responseString);

相关问题