如何模拟 SecurityContextHolder.getContext().getAuthentication().getCredentials()

Sri*_*inu 4 junit spring-security mockito

当我试图嘲笑

SecurityContextHolder.getContext().getAuthentication().getCredentials()
Run Code Online (Sandbox Code Playgroud)

要获取Mapof UserDetails,它会返回错误。

任何人都可以建议使用 Mockito 完成此任务的最佳方法吗?

Ken*_*han 13

存储SecurityContext在里面ThreadLocal。在运行测试用例之前,您必须为当前正在运行的线程SecurityContextHolder.getContext()创建SecurityContext并为其设置模拟Authentication,这相当于登录。

测试用例结束后,可以使用SecurityContextHolder.clearContext()清除SecurityContextThreadLocal相当于注销。

就代码而言,它看起来像:

    @ExtendWith(MockitoExtension.class)
    public class TestSecurity {
    
        @Mock
        private Authentication auth;
    
        @BeforeEach
        public void initSecurityContext() {
            when(auth.getCredentials()).thenReturn("mockedPassword");
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
    
        @Test
        public void test() {
            //Access  getCredentials() which should return the mocked password
            SecurityContextHolder.getContext().getAuthentication().getCredentials();
        }
    
        @AfterEach
        public void clearSecurityContext() {
            SecurityContextHolder.clearContext();
        }
    
    }
Run Code Online (Sandbox Code Playgroud)

或者,如果您有兴趣,您也可以考虑使用@WithMockUserSpring Security Test 来模拟Authentication而不是使用Mockito.