【发布时间】:2020-12-04 17:54:35
【问题描述】:
这是这个问题的延续 Spring WebMvcTest how to mock Authentication?
我正在尝试在 Spring-boot 中测试一个控制器方法,该方法接收一个 Authentication 对象作为参数。控制器是带有@CrossOrigin 注释的RestController。该方法如下所示:
@GetMapping("/authentication")
public String testAuthentication(Authentication authentication) {
UserDetailsStub userDetailsStub = (UserDetailsStub) authentication.getPrincipal();
return userDetailsStub.getUsername();
}
如您所见,我从参数中获取了身份验证的主体。
问题是,在我的WebMvcTest 测试用例中,我得到一个NullPointerException,因为在测试用例中,authentication 似乎为空。我的问题是为什么?
我尝试添加一个given 调用,它将在测试用例中的@PostConstruct 注释方法中返回一个自定义UserDetails 对象,但我仍然得到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());
}
}
为什么authentication 在测试用例中为空,即使我在@PostConstruct 方法中提供它?
可以在此处找到包含最少代码的 GitHub 项目来重现错误。 https://github.com/Kars1090/SpringSecurityTest
谢谢!
【问题讨论】:
标签: java spring spring-boot spring-security