【发布时间】: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