我正试图为我面临ClassCastException的Spring Boot微服务应用程序编写Junit测试用例。
@Mock
Authentication authentication;
@Mock
AuthenticatedUser authUser;
@Before
public void setUp(){
mockMvc = MockMvcBuilders.webAppContextSetup(applicationContext).build();
authentication = Mockito.mock(Authentication.class);
}
@Test
@WithMockUser(username="myuser@test.com")
public void postApiSucess() throws Exception {
ObjectMapper mapper = new ObjectMapper();
mockMvc.perform(post("/myapi/").content(mapper.writeValueAsString(customEventsTrace))
.contentType(MediaType.APPLICATION_JSON)
.with(authentication(SecurityContextHolder.getContext().getAuthentication())))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().contentType(Test.APPLICATION_JSON_UTF8));
}
现在,当它碰到控制器并面对语法
时AuthenticatedUser authUser = (AuthenticatedUser) SecurityContextHolder.getContext().getAuthentication()
.getPrincipal();
该异常为
java.lang.ClassCastException: org.springframework.security.core.userdetails.User cannot be cast to com.demo.example.AuthenticatedUser
而AuthenticatedUser实现了UserDetetails
public class AuthenticatedUser implements UserDetails
我在这里做错了什么?
答案 0 :(得分:0)
在Spring应用程序中,尼古拉斯注释是“正确的”,通常,调用getPrincipal()将返回UserDetail对象。
从Spring安全性部分开始,它应该足以处理UserDetail对象,而不必处理应用程序对User(AuthenticatedUser)的要求。
可能来自Baeldung的链接会为您提供一些帮助:https://www.baeldung.com/get-user-in-spring-security或https://www.baeldung.com/spring-security-authentication-with-a-database