当前位置: 首页 > 知识库问答 >
问题:

JUnit:mockMvc头不允许使用cookie?

易品
2023-03-14

我正在测试一个用Java和spring boot写的应用程序,我有一个问题。我的测试模拟一个HTTP请求,该请求只有在CustomData数据放置在Cookie头中时才有效。这是我的简单测试的代码:

@Test
    public void myFristTest() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post(MY_URL)
                .header("Cookie", "customData=customString")
                .accept(MediaType.APPLICATION_JSON_VALUE)
                .contentType(MediaType.APPLICATION_JSON_VALUE)
                .content(ConversionUtil.objectToString(BODY_OF_MY_REQUEST)))
                .andExpect(status().isCreated());
    }

不幸的是这次测试失败了。用于测试的Java代码如下:

String customData;
Cookie[] cookies = request.getCookies();
        
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("customData")) {
                    customData = cookie.getValue();
                }
            }
        }

if(customData != null) {
    // code that returns HTTP status isCreated
} else {
    throw new HttpServerErrorException(HttpStatus.FOUND, "Error 302"); 
}

在实际操作中,似乎找不到应该从请求头cookie中取出的customData字符串!因此,测试只评估else分支,实际上在stacktrace中也告诉我,测试希望状态已创建,但状态302已给出。既然应用程序(没有测试)可以工作,这又怎么解释呢?我想象我的测试中的.header(“cookie”,“customData=customString”)没有做我想做的事情,即没有正确设置头cookie,这就是我的方法失败的原因。我如何做一个真正将Cookie头插入到请求中的正确测试?我使用JUnit4。

共有1个答案

微生永春
2023-03-14

MockHttpServletRequestBuilder类提供Cookie生成器方法来添加Cookie。为测试在内部创建的MockHttpServletRequest忽略通过Header方法添加的“cookie”标头。

因此创建cookie并将其添加

Cookie cookie = new Cookie("customData", "customString");

mockMvc.perform(MockMvcRequestBuilders.post(MY_URL)
        .cookie(cookie)
        .accept(MediaType.APPLICATION_JSON_VALUE)
        .contentType(MediaType.APPLICATION_JSON_VALUE)
        .content(ConversionUtil.objectToString(BODY_OF_MY_REQUEST)))
        .andExpect(status().isCreated());

 类似资料:
  • 我试图使用发出ajax请求,当我这样做时,我得到一个错误。 我是这样执行的: 这给了我一个错误。如果我删除标头,请求将通过。但是,我需要该头在服务器上进行验证。 我的电脑中有以下设置。htaccess文件: 我不确定是什么原因导致这一切无法进行。

  • 问题内容: 我正在尝试在表格中添加序列号。这是我的方法: 为什么此方法给我一个错误,而我的结果集已设置为可更新。我正在使用derby数据库。 问题答案: 根据Derby文档,带有的查询不可更新: 只有简单的单表SELECT游标才可以更新。可更新ResultSet的SELECT语句与可更新游标的SELECT语句具有相同的语法。生成可更新的游标: 该语句不能包含子句。 基础查询必须是SelectExp

  • 我正在尝试在网页上嵌入一个小程序。我已经将代码导出为IntelliJ中的压缩applet。现在,当我尝试运行它时,我得到以下堆栈跟踪: 我相信该错误是由于试图使用类中的方法获取图像而导致的。这是代码: 下面是我在HTML中使用的标记以供参考: 如果您想亲自查看错误,只需访问http://nrubin29.github.io/freefall-applets/ 谢谢!

  • 我使用axios调用api和承载令牌的方式进行授权,我的代码: 在用户存储库中。js时,将导入存储库并通过以下方式调用api: 然后错误是"未授权",但当我更新头: 错误是:在'http://example.com/users“起源”http://localhost:8080'已被CORS策略阻止:飞行前响应中的访问控制允许标头不允许请求标头字段访问控制允许来源。

  • 问题内容: 我打算使用Ajax将跨域请求发送到soap Web服务。Web服务的URL是:http://example1.asmx?op = GetVOD 我的代码: 在IIS 7服务器端,我已经将这些行添加到文件web.config中 当我在Chrome上运行客户端代码时,出现405错误: 有谁知道如何解决这个问题? 预先感谢 问题答案: 听起来像Web DAV正在阻碍。这是删除它的配置: ht

  • 如何在AngularJS应用程序上设置我的. htaccess以防止以下错误消息: 加载失败:请求标头字段授权在飞行前响应中不被访问控制允许标头允许。 这是我的文件: 每当用户试图提交联系表单时,我都会在我的网站上收到错误消息。 这是我的流程代码: