【问题标题】:Spring Security Test @WithMockUser not workingSpring Security 测试@WithMockUser 不起作用
【发布时间】:2021-11-09 12:33:32
【问题描述】:

我正在为我的应用程序编写单元测试,我在服务中执行的步骤之一是从 SpringSecurityContext 获取当前经过身份验证的用户。

我知道如果我想模拟 Spring Security Authentication 我可以使用 @WithMockUser 但它对我不起作用,因为当测试方法到达 getAuthentication() 方法调用时它总是返回 null...

我已经搜索了许多 SO 问题和许多博客文章,但没有一个有解决方案。 我用 @ExtendWith(MockitoExtension.class) 注释我的测试类

我想避免编写 4 行来模拟单个方法调用

// 模拟身份验证
// 模拟校长
// 当 SpringContextHolder.getContext().getAuthentication -> return Authentication
// 当 getPrincipal() -> 返回 Principal 时

编辑:

测试类

@ExtendWith(MockitoExtension.class)
public class SegmetnServiceTest {
    
    @InjectMocks
    private SegmentService service;


    @Test
    void testWithMockUser() {
            //given
            UpdateSegmentReq request = new UpdateSegmentReq();
            String name = "TEST"
            request.setName(name)

            //when
            SegmentNode segment = service.updateSegment(request);

            //then
            assertEquals(segment.getName(), name)
    }
}

服务类

public class SegmentService {

    private SegmentRepository repository;

    SegmentNode updateSegment(String code){
        SegmentNode segment = repository.findByCode(code);

        String userId = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        segment.updatedBy(userId);


        return segment;
    }
}

问题是,即使我用 @WithMockUser 注释了我的测试方法,当它到达服务方法时 getAuthentication 为 null 并且 getPrincipal 抛出 NPE。

【问题讨论】:

  • 没有看到你的测试,这将是不可能回答的。
  • 完成! @M.Deinum
  • 你在该测试中没有使用任何与 Spring 相关的东西(你只使用了 Mockito),所以用 @WithMockUser 注释它不会做任何事情。
  • 好的,我怀疑这与 Spring Context 相关,但如果我想让我的单元测试保持轻松,我应该添加的最少注释是什么?顺便说一句,我正在使用 JUnit 5。谢谢@M.Deinum
  • 您始终可以自己设置上下文,不要忘记在测试后清除它。

标签: java spring unit-testing testing spring-security


【解决方案1】:

您应该使用 @ContextConfiguration 将 Spring Security 测试配置加载到应用程序上下文中(假设您还有 spring-test 作为依赖项)See for clarification

您可以使用注解@SpringJUnitConfig 组合所需的注解——@ExtendWith(SpringExtension.class)@ContextConfiguration——在您的测试中设置 spring 测试。

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 2016-08-03
    • 2017-04-15
    • 2019-03-07
    • 2016-07-12
    • 2018-05-15
    • 2012-01-02
    • 2020-06-06
    • 2017-06-08
    相关资源
    最近更新 更多