使用 MockMvc 在 Spring MVC 中进行单元测试/登录

2023-11-21

我有一个使用 Spring MVC 创建的非常简单的 REST 应用程序。 (代码可在GitHub.)它有一个简单的WebSecurityConfigurer如下:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    httpSecurity
            .csrf().disable()
            .exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPoint)
                .and()
            .authorizeRequests()
                .antMatchers("/user/new").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login").permitAll()
                .successHandler(authenticationSuccessHandler)
                .failureHandler(authenticationFailureHandler)
                .and()
            .logout()
                .permitAll()
                .logoutSuccessHandler(logoutSuccessHandler);
}

当我运行该应用程序时,自定义控制器和登录/注销页面都可以正常工作。我什至可以单元测试 /user/new via MockMvc。但是,当我尝试测试时/login具有以下功能

@Test
public void testUserLogin() throws Exception {
    RequestBuilder requestBuilder = post("/login")
            .param("username", testUser.getUsername())
            .param("password", testUser.getPassword());
    mockMvc.perform(requestBuilder)
            .andDo(print())
            .andExpect(status().isOk())
            .andExpect(cookie().exists("JSESSIONID"));
}

它失败如下:

MockHttpServletRequest:
         HTTP Method = POST
         Request URI = /login
          Parameters = {username=[test-user-UserControllerTest], password=[test-user-UserControllerTest-password]}
             Headers = {}

             Handler:
                Type = org.springframework.web.servlet.resource.ResourceHttpRequestHandler

               Async:
   Was async started = false
        Async result = null

  Resolved Exception:
                Type = org.springframework.web.HttpRequestMethodNotSupportedException

        ModelAndView:
           View name = null
                View = null
               Model = null

            FlashMap:

MockHttpServletResponse:
              Status = 405
       Error message = Request method 'POST' not supported
             Headers = {Allow=[HEAD, GET]}
        Content type = null
                Body = 
       Forwarded URL = null
      Redirected URL = null
             Cookies = []

java.lang.AssertionError: Status expected:<200> but was:<405>

但我是相当用户POST to /login当我运行应用程序而不是测试时正在工作。此外,当我尝试制作一个GET or HEAD请求(如建议的Headers = {Allow=[HEAD, GET]}日志行),这次我收到 404。关于发生了什么以及如何修复它有什么想法吗?


您可以使用 Spring 安全测试类来测试基于表单的登录。您需要执行以下操作来测试基于表单的登录。

Maven 依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>4.0.0.M1</version>
    <scope>test</scope>
</dependency>

<repositories>
    <repository>
        <id>spring-snasphot</id>
        <url>https://repo.spring.io/libs-snapshot</url>
    </repository>
</repositories>

测试类:

import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin;

RequestBuilder requestBuilder = formLogin().user("username").password("passowrd");
mockMvc.perform(requestBuilder)
    .andDo(print())
    .andExpect(status().isOk())
    .andExpect(cookie().exists("JSESSIONID"));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 MockMvc 在 Spring MVC 中进行单元测试/登录 的相关文章

随机推荐

  • Android Studio 3.0 Canary 1下无法编译

    我尝试在 AS 3 0 Canary 1 下编译我的 Android 项目 在 AS 2 3 2 稳定版本上工作正常 但失败并出现以下错误 FAILURE Build failed with an exception What went w
  • 在 Rails3 中将块传递给标签助手

    我想用一些嵌套元素创建标签标记 我正在使用标签助手并尝试将内部 html 作为块传递 但生成的 HTML 看起来并不像我预期的那样 雇员福利局 span Span element span span Inner span span HTML
  • 如何在 Maven settings.xml 中设置存储库的顺序

    我的 settings xml 中有 3 个存储库 因为我需要所有这些存储库的工件 每当找不到依赖项时 Maven 就会尝试 Downloading http some server mvn2repo releases org apache
  • MySQL 按最高值选择 DISTINCT

    我有一桌子杂志 需要提取每本杂志的最新一期 我试过了 SELECT DISTINCT magazine FROM product p INNER JOIN SELECT title MAX onSale AS Latest FROM pro
  • 如何将 C++ 成员函数作为参数传递给 C API

    在我的 C 程序中 我需要调用这个 c API GConn gnet conn new const gchar hostname gint port GConnFunc func 其中 GConnFunc 定义为 void GConnFun
  • PHP速度测试当前页面无回显的用户连接速度

    我正在寻找一种检查用户连接速度的可能性 它应该被保存为cookie 如果速度慢的话 javascript文件以及css文件将被适配 我目前测试速度的可能性如下 kb 512 flush echo start time 0 time 1 fi
  • 浮点数的符号

    有没有一种简单的方法来确定浮点数的符号 我进行了实验并想出了这个 include
  • 如何使用算法来填充向量的向量

    I have typedef std vector
  • AngularJS $http:如何避免重定向跟随

    在 AngularJS 应用程序中 我对服务器 URL 进行 http post 调用 这个url的成功响应是30x重定向 我的问题是 http post严格遵循这个重定向并在成功回调中返回最终调用的结果 我想拦截此重定向并手动将用户重定向
  • 返回页面中所有 iframe 的 ID

    由于我正在使用的小部件格式 我有一个页面 其中嵌入了多个 iframe 我不会粘贴代码 因为它庞大且笨拙 但它本质上就是这样
  • Android Gradle 应用程序:connectedCheck 从依赖项运行测试

    我有一些有自己的测试的图书馆项目 我不负责这个库项目 也不关心它的测试 但是 当我运行时gradle app connectedCheck它运行我的测试 但它也运行依赖项的测试 有什么办法可以防止这种情况发生吗 我应该提到我的依赖项不在ap
  • decimal.InvalidOperation,除法对于非常大的数字来说是不可能的

    使用Python 3 5 2 gt gt gt from decimal import Decimal gt gt gt Decimal 12 Decimal 0 01 Decimal 0 00 gt gt gt Decimal 23456
  • Linq 相当于 SQL LEFT 函数?

    我们有一个数据库 其中一些字段为 varchar max 可能包含大量文本 但是我遇到的情况是 我只想从字段中选择前 300 个字符 以用于 MVC 网站上的分页结果表进行该领域的 预览 对于一个简化的示例查询 我想在表中显示所有位置 这将
  • 按连续序列对整数进行分组列表

    我有一个整数列表 1 2 3 4 5 8 9 10 11 200 201 202 我想将它们分组到一个列表列表中 其中每个子列表都包含顺序未被破坏的整数 像这样 1 5 8 11 200 202 我有一个相当笨拙的工作 lSequenceO
  • 在淘汰赛中重新应用绑定

    我基本上想在同一页面上为不同的对象重新应用绑定 但有奇怪的行为 重新应用绑定后 项目列表丢失 请看这里 http jsfiddle net baio 9UcUs 5 该怎么办 简短的回答是不支持 长的答案是有一些方法可以解决这个问题 一种方
  • 使用反射解压数组

    我正在尝试解压从反映对象字段获得的数组 我将常规字段的值设置为一个对象 如果它是一个数组 那么我想将我的通用对象转换为数组 无论其类型是什么 并提取其内容 fields i setAccessible true String key fie
  • 如何直接从IDE读取Python源代码

    我目前正在学习Python 我想通过阅读它的源代码来更深入地了解Python是如何工作的 我可以手动进入Python安装目录查看源代码 我想知道是否可以直接从PyCharm等IDE读取Python源代码 我尝试过了control click
  • 如果没有互联网连接,xmlns属性如何工作并被浏览器理解?

    一个简单的 XHTML 文档 具有最少的所需标签 以及xmlns属性有一个 http 链接 如果我在 localhost 上工作并且没有 Internet 连接 我不能在 XHTML 上工作吗 The content of the docu
  • 导入语句错误“需要“FILENAME”或

    我在将 Appirater 集成到我的应用程序中时遇到一些问题 我已经正确添加了所有必要的文件 并且拥有正确的代码 我认为 但是在尝试将其实现到我的 AppDelegate m 文件中时出现错误 当我做 import Appirater h
  • 使用 MockMvc 在 Spring MVC 中进行单元测试/登录

    我有一个使用 Spring MVC 创建的非常简单的 REST 应用程序 代码可在GitHub 它有一个简单的WebSecurityConfigurer如下 Override protected void configure HttpSec