gpt4 book ai didi

java - 调用 Spring SecurityContextHolder 时出现 NullPointerException

转载 作者:行者123 更新时间:2023-11-29 03:11:40 26 4
gpt4 key购买 nike

我一直在尝试为以下代码行编写测试用例,但我不断收到 java.lang.NullPointerException,我已尝试遵循/复制其他人在此处提出的建议 Unit testing with Spring Security但我没有运气。有人可以帮助我更好地识别或提示我需要做什么。 (我为此使用 mockito)

代码:

if (SecurityContextHolder.getContext().getAuthentication().getPrincipal().equals(user)) {
continue;
}

测试用例:

@Test
public void testExpireAllSession() throws Exception {

SecurityContext securityContext = Mockito.mock(SecurityContext.class);
Mockito.when(securityContext.getAuthentication().getPrincipal().equals(any(Object.class))).thenReturn(false);
SecurityContextHolder.setContext(securityContext);

controller.theMEthodUnderTest();
}

..

最佳答案

你的测试有两个问题:

  1. 您必须模拟每个“级别”的方法调用,您应该模拟:

    • SecurityContext.getAuthentication()
    • Authentication.getPrincipal()
    • Principal.equals()
  2. 但是,您不能模拟 .equals(),参见 Mockito FAQ - limitationsMockito - Issue 61 .

您必须以不同的方式设计您的代码/测试。例如,将“用户”主体传递给您的方法参数,并使 Authentication.getPrincipal() 返回另一个主体(它们将不同,从而使 equals 返回 false):

代码

public void theMethod(Principal user) {
...
if (SecurityContextHolder.getContext().getAuthentication().getPrincipal().equals(user)) {
continue;
}
...
}

测试

@Test public void testController() {
SecurityContext securityContext = Mockito.mock(SecurityContext.class);
Authentication authentication = Mockito.mock(Authentication.class);
Principal principal1 = Mockito.mock(Principal.class);
Principal principal2 = Mockito.mock(Principal.class);
Mockito.when(authentication.getPrincipal()).thenReturn(principal1);
Mockito.when(securityContext.getAuthentication()).thenReturn(authentication);
SecurityContextHolder.setContext(securityContext);
new Controller().theMethod(principal2);
}

关于java - 调用 Spring SecurityContextHolder 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040317/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com