具有Junit测试用例的ClassCastException

时间:2018-10-29 17:00:43

标签: java spring spring-boot junit

我正试图为我面临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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

在Spring应用程序中,尼古拉斯注释是“正确的”,通常,调用getPrincipal()将返回UserDetail对象。

从Spring安全性部分开始,它应该足以处理UserDetail对象,而不必处理应用程序对User(AuthenticatedUser)的要求。

可能来自Baeldung的链接会为您提供一些帮助:https://www.baeldung.com/get-user-in-spring-securityhttps://www.baeldung.com/spring-security-authentication-with-a-database