Spring-Boot WebMvcTest:如何使用 Authentication 对象参数测试控制器方法?

2023-11-25

这是这个问题的延续Spring WebMvcTest如何模拟身份验证?

我正在尝试在 Spring-boot 中测试接收一个控制器方法Authentication对象作为参数。控制器是一个RestController with @CrossOrigin注解。该方法如下所示:

@GetMapping("/authentication")
public String testAuthentication(Authentication authentication) {
    UserDetailsStub userDetailsStub = (UserDetailsStub) authentication.getPrincipal();
    return userDetailsStub.getUsername();
}

正如您所看到的,我从参数中的身份验证中获取了主体。

问题是,在我的WebMvcTest测试用例我得到一个NullPointerException因为在测试用例中,authentication似乎为空。我的问题是为什么?

我尝试过添加一个given调用将返回一个自定义的UserDetails对象在一个@PostConstruct测试用例中带注释的方法,但我仍然得到NullPointerException.

我的测试用例如下所示:

@Import(SecurityConfiguration.class)
@RunWith(SpringRunner.class)
@WebMvcTest(PDPController.class)
@AutoConfigureMockMvc(addFilters = false)
public class PDPControllerTests {

    @Autowired
    private MockMvc mvc;

    @MockBean(name = "userDetailsService")
    private MyUserDetailsService userDetailsService;
    
    //..

    @PostConstruct
    public void setup() {
        given(userDetailsService.loadUserByUsername(anyString()))
                .willReturn(new UserDetailsStub());
    }
    
    //..

    @Test
    @WithUserDetails(value = "username", userDetailsServiceBeanName = "userDetailsService")
    public void testAuthentication() throws Exception {
        mvc.perform(get("/pdps/authentication").secure(true)
                .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk());
    }
    
}

Why is authentication测试用例中为 null,即使我在@PostConstruct method?

可以在此处找到具有重现错误的最少代码的 GitHub 项目。https://github.com/Kars1090/SpringSecurityTest

Thanks!


克隆您的项目后,我已经获得了有效的Authentication控制器方法中的对象。基本上你的测试中有两个主要问题:

  1. 不必要的额外配置
  2. 过滤器的错误模拟配置:JwtRequestFilter

概括而言,变化如下:

public class UserDetailsStub implements UserDetails {

  private String username;
  private String password;
  private Collection<? extends GrantedAuthority> authorities;

  public UserDetailsStub() {}
        
  public static UserDetailsStub of (User user) {
    UserDetailsStub userDetails = new UserDetailsStub();
    if (null != user) {
        userDetails.username = user.getUsername();
        userDetails.password = user.getPassword();
        userDetails.authorities = user.getAuthorities();
    }
    return userDetails;
  }

  @Override
  public Collection<? extends GrantedAuthority> getAuthorities() {
    return authorities;
  }

  @Override
  public String getPassword() {
    return password;
  }

  @Override
  public String getUsername() {
    return username;
  }
  // Rest of the code is equal to your version

您的控制器方法:

@GetMapping("/authentication")
public String testAuthentication(Authentication authentication) {
  UserDetailsStub userDetailsStub = UserDetailsStub.of((User) 
    authentication.getPrincipal());
  return userDetailsStub.getUsername();
}

和测试:

@WebMvcTest(value = PDPController.class)
public class PDPControllerTests {

  @Autowired
  private MockMvc mvc;

  /** You have not to mock the filter because in that case Spring
   * won't know how to deal with it, when the list of them
   * should be managed.
   *
   * That is the reason why you had to include
   * @AutoConfigureMockMvc(addFilters = false), but that
   * is preciselly what was avoiding the creation of your
   * Authentication object, because your JwtRequestFilter
   * was not being executed.
   *
   * With the current code, your filter will be executed and
   * the Authentication object created.
   */
   //@MockBean
   //private JwtRequestFilter jwtRequestFilter;

   // What you have to mock are the classes the filter uses internally
   @MockBean
   private MyUserDetailsService userDetailsService;

   @MockBean
   private JwtService jwtService;

   @Test
   @WithMockUser
   public void test() throws Exception {
     mvc.perform(
            get("/pdps/authentication").secure(true)
                    .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk());
   }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring-Boot WebMvcTest:如何使用 Authentication 对象参数测试控制器方法? 的相关文章

  • 使用现有同级属性值对属性进行 Jackson 多态反序列化

    我有一个现有的Request Response协议使用JSON我无法控制 示例1 响应JSON不需要任何多态反序列化 name simple response params success true 示例2 响应JSON需要对 params
  • JMenuItem:如何设置具有3个键的加速器?

    请看下面的代码 import java awt import java awt event import javax swing public class MenuActions extends JFrame private JMenuBa
  • 如何在 Android 上将 ISO 8601 字符串解析为 Java 日期 [重复]

    这个问题在这里已经有答案了 我正在 Android 上创建一个与服务器通信的应用程序 该服务器给我返回了一个ISO 8601 http en wikipedia org wiki ISO 8601日期字符串 如下所示 2014 11 21
  • 如何防止 gson 将整数转换为双精度数

    我的 json 中有整数 但我不希望 gson 将它们转换为双精度数 以下不起作用 Test public void keepsIntsAsIs String json id 1 quantity 2 name apple id 3 qua
  • OpenGL ES 2.0 只绘制一次对象

    首先我要说的是 很抱歉今天问了这么多问题 所以 我有一个圈子的课程 我有一个包含 3 个圆形实例的数组列表 每个实例都有不同的 x 坐标来绘制 不管出于什么原因 OpenGL ES 2 0 只绘制其中之一 尽管我调用所有这些来绘制 我检查了
  • Java:输入/使用“try-catch”块的开销?

    这个问题说明了一切 尽管命中率不是很高 我测得速度慢了 1 5 倍到 2 倍 但使用 try catch 的字节码和不使用 try catch 的字节码之间没有区别 那么是什么让它通常变慢呢 PL 请注意 问题不是抛出异常的开销 而是进入
  • 在 IntelliJ IDEA 中编辑并继续?

    使用 IntelliJ IDEA 社区版进行调试时是否可以编辑一些代码 我在选项中找不到这个功能 是的 这就是所谓的 热插拔 您可以在调试过程中编译修改后的代码 并且类文件将被替换 直到您停止调试 确保在调试器设置中启用 HotSwap 选
  • Java.lang.NoClassDefFoundError:com/fasterxml/jackson/databind/exc/InvalidDefinitionException

    我已经更新了我的依赖项 就像您在评论中所说的那样 我现在有这个 org springframework context ApplicationContextException Unable to start embedded contain
  • Hibernate 时间戳 - 毫秒精度

    似乎以毫秒精度存储时间戳是休眠的一个已知问题 我在数据库中的字段最初设置为时间戳 3 但我也尝试过日期时间 3 不幸的是 它没有任何区别 我尝试过使用 Timestamp 和 Date 类 最近我开始使用 joda time 库 经过所有这
  • 如何将一个组件放在其他组件之上?

    我有一个JScrollPanel其中包括一个大面板 其本身包括 3 个内面板 我想将一个面板 例如 放在一个特殊的位置 以便始终可以看到 我的意思是用户可以滚动到想要的任何地方 但该面板始终位于其他组件的顶部并且不会移动 我试图通过这样做J
  • 全屏 Swing 组件无法在 Mac OS X Mountain Lion 上的 Java 7 上接收键盘输入

    12 21 更新 7u10 最近发布 确认 问题仍然存在 值得庆幸的是 解决方法仍然有效 11 7 更新 我们有一个解决方法 来自 Oracle 的 Leonid Romanov 在 openjdk java net 邮件列表上提供了一些关
  • LoggerFactory.getLogger(ClassName.class) 与 LoggerFactory.getLogger(this.getClass().getName())

    我正在努力提高我的 Java 优化技能 为了实现这一目标 我制作了一个旧程序 并且正在尽力使其变得更好 在此程序中 我使用 SL4J 进行日志记录 为了获取记录器 我做了 private static final Logger logger
  • 如何在同一行实例化对象并调用setter?

    如果我有一个Employee具有默认构造函数的类 private String firstName public Employee 和一个二传手 public void setFirstName String firstName this
  • 带句点和逗号的自定义格式数字

    有点相关这个问题 https stackoverflow com questions 4738853 java decimal format parse to return double value with specified numbe
  • Spring MVC @RequestBody 不适用于 jquery ajax?

    这是我的ajax请求 var dataModel name1 value1 name2 value2 ajax url testURL type POST async false contentType application json d
  • 纹理映射和光照顶点着色器错误 Java OpenGL

    我正在尝试将纹理映射到 3D 立方体并尝试编写着色器以使其具有照明和纹理 我尝试过只编写纹理着色器并且它有效 我还尝试过仅将 3D 值设置为红色的照明着色器 并且该照明着色器也可以工作 但当我尝试将两者结合起来时 我遇到了问题 我在下面提供
  • JarSplice 的命令行参数?

    罐子接头 http ninjacave com jarsplice允许将 jar 文件以及其他依赖项和库聚合到一个可执行 jar 文件中 但是 我的可执行 jar 需要两个命令行参数 当我调用 JarSplice jar 时 这两个参数似乎
  • 从 blob 反序列化 java 对象

    首先 我很抱歉 我要问一些愚蠢的问题 我根本不懂java 也不知道我们是否可以问这样的问题 如果没有 删除我的主题 oracle中有一个存储blob的表 它是二进制的 我能够解码它 输出看起来像这样 sr com epam insure c
  • JSON 解析为 Java - Android 应用程序

    我需要在 Java Android 应用程序中解析 json 字符串的帮助 JSON 文件的文本 data columns location id name description latitude longitude error type
  • Hibernate 对于 Android 应用程序来说是一种杀伤力吗? [复制]

    这个问题在这里已经有答案了 我正在为我的 Android 应用程序寻找一个好的 ORM 乍一看似乎对于移动设备我更喜欢使用更简单的东西 问题是我只是在这里假设 没有真正的证据 所以我想我应该询问社区的意见 也许有人有过这样的经历 它是一个相

随机推荐

  • 更改 VS code 中的 java.home 路径

    I just installed java 11 coz VS code was prompting me to update it to java 11 or newer version After installing java 14
  • 如何使用 TarsosDSP 获得 MFCC?

    我到处搜索 但不知道如何在 Android 上使用 TarsosDSP 提取 MFCC 特征 我知道如何从文件中获取 FFT 有什么帮助吗 查看官方github页面 MFCC 测试文件 public class MFCCTest priva
  • 人们对动态语言有何吸引力? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 Locked 这个问题及其
  • 如何为 Blazor 页面实现自定义授权过滤器

    Blazor 服务器端 NET Core 3 1 x 查看有关授权的示例 我正在尝试获取自定义授权过滤器 属性的解决方案 我只需要在授权期间检查用户身份 https learn microsoft com en us aspnet core
  • Visual Studio 2017不支持C11新功能_Generic

    谁能告诉我为什么 Visual Studio 2017 不支持 C11 新功能 Generic 我发现这是一个非常有用的功能 但无法在 Visual Studio 2017 中使用 下面是示例代码 include
  • Terraform 在应用时从远程 URL 下载本地文件并在销毁时删除文件

    在创建实际的 lambda 资源之前 我需要从 URL 下载 lambda 存档文件 并且在运行 terraform destroy 时需要删除该文件 基本上是从远程 URL 创建的本地文件资源 我目前使用的是null resource a
  • 在 MATLAB / Octave 中为 n > 100 创建更快的斐波那契函数

    我有一个函数可以告诉我斐波那契数列中的第 n 个数字 问题是 当试图在斐波那契数列中找到更大的数字时 它变得非常慢 有人知道我该如何解决这个问题吗 function f rtfib n if n 1 f 1 elseif n 2 f 2 e
  • Android 共享资源文件夹中的图像

    我正在尝试共享资产文件夹中的图像 我的代码是 Intent share new Intent Intent ACTION SEND share setType image jpg share putExtra Intent EXTRA ST
  • app.config 的自定义配置 - 部分集合?

    我的头实在是太痛了 我以前做过这件事 但没有这么 深入 或复杂 我尝试了不同的方法来实现这一点 但都失败了 所以 这是我想要在 app config 中使用的自定义 XML
  • 将内部类与 CRTP 一起使用

    是否有可能在 CRTP 中使用内部类或枚举 前任 template
  • 抛出 HttpException 总是会发回 HTTP 500 错误?

    我试图向客户端返回 HTTP 403 错误代码 我读过 HttpException 是完成此任务的最干净的方法 但它对我不起作用 我从这样的页面中抛出异常 throw new HttpException 403 You must be lo
  • Hibernate 4.1.9:我需要哪些 jar 文件?

    我开始学习Hibernate框架是从 Hibernate 3 2 简单步骤 书 但我下载了最新版本的 Hibernate 即 4 1 9 根据书 我们需要将许多必要的 jar 添加到类路径中 例如 Anttr 2 7 6 jar asm j
  • iPhone:OpenAL 和 AudioToolbox 泄露

    我与 OpenAL 合作在我的应用程序中播放声音 当我使用测试它时Instruments工具 它发现泄漏 泄露对象 GeneralBlock 512大小 512 字节负责库 AudioToolbox责任框架 AU3DMixerEmbedde
  • 如何计算处理图像所需的内存?

    我想对用户上传的图像进行一些限制 以便处理它们的脚本永远不会耗尽内存 占用更多内存的图像是分辨率更高的图像 它们不需要很大的字节大小 例如 分辨率为 4000x2500 的 46kb 图像和一些透明胶片 PNG 需要大约 90mb 来调整其
  • 优先级为 99 的 SCHED_FIFO 进程被抢占?

    这是来自 sched setscheduler 2 Linux 手册页 在实时策略之一 SCHED FIFO SCHED RR 下调度的进程的 sched priority 值在 1 低 到 99 高 范围内 SCHED FIFO 进程会一
  • 通过 php 脚本发送 iOS 通知:“无法设置私钥文件”

    我使用了著名的 Ray Wanderlich 的 php 脚本tutorial在开发阶段发送推送通知 在我创建 pem 文件 来自 p12 和 aps development cer 文件 并在 php 脚本中提到设备令牌后 它们被正确触发
  • 如何在黑莓上编写短信应用程序?

    任何人都可以帮我编写在黑莓中发送和接收短信的应用程序吗 如果你可以给我提供一些代码片段 发送短信 import net rim device api io import net rim device api system import ja
  • 将子查询作为逗号分隔值的 Linq 查询

    在我的应用程序中 一家公司可以有许多员工 每个员工可能有多个电子邮件地址 数据库模式将表关联起来 如下所示 公司 gt CompanyEmployeeXref gt 员工 gt EmployeeAddressXref gt 电子邮件 我正在
  • JPanel 在另一个里面

    我的 JPanel 位于另一个 JPanel 中时遇到问题 我不知道为什么 但结果是一个简单的正方形 但尺寸不正确 这是为什么 import java awt Color import java awt Container import j
  • Spring-Boot WebMvcTest:如何使用 Authentication 对象参数测试控制器方法?

    这是这个问题的延续Spring WebMvcTest如何模拟身份验证 我正在尝试在 Spring boot 中测试接收一个控制器方法Authentication对象作为参数 控制器是一个RestController with CrossOr