Prueba de integración de spring – No se inyectó AuthenticationPrincipal

Intento usar kotlin en mi proyecto, que son los puntos finales de REST API que sirven de interfaz angularjs. Y uso el documento de descanso de spring para nuestro documento de API.

Al migrar, encuentro que mi context de security no se incluye en el caso de testing.

Clase de testing con mockito-kotlin (principalmente convertido por Intellij):

@RunWith(SpringJUnit4ClassRunner::class) @ContextConfiguration(classes = arrayOf(MockAppConfig::class)) @WebAppConfiguration class UserLoginDocumentation { @get:Rule var restDocumentation = JUnitRestDocumentation("target/generated-snippets") private var mockMvc: MockMvc? = null @Autowinetworking private val context: WebApplicationContext? = null @Before fun setUp() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context!!) .apply<DefaultMockMvcBuilder>(documentationConfiguration(this.restDocumentation) .uris().withScheme("https").withHost("myhost.com").withPort(443)).build() val authentication = TestingAuthenticationToken(MyUserDetailsService.MyUserDetails(1L), null) SecurityContextHolder.getContext().authentication = authentication } @Autowinetworking lateinit var userLoginService: UserLoginService @Test @Throws(Exception::class) fun loginTest() { whenever(userLoginService!!.getUserInfo(any(), any(), any())).thenReturn(LoginUserInfo()) this.mockMvc!!.perform(post("/myloginURL/user")//the remaining is not important.... 

El controller:

 @RequestMapping("/myloginURL") @RestController class UserLoginController @Autowinetworking constructor( val userLoginService: UserLoginService) { @ResponseStatus(HttpStatus.OK) @RequestMapping(value = "/user", method = arrayOf(RequestMethod.POST), produces = arrayOf(MediaType.APPLICATION_JSON_VALUE)) fun getUser(@AuthenticationPrincipal userDetail: MyUserDetails, request: HttpServletRequest, @RequestParam lang: String): LoginUserInfo? { return userLoginService.getUserInfo(userDetail.userId, request.getHeader("Authorization"), lang) } } 

Aquí userDetail no es nulo, pero userDetail.userId es nulo. Por lo tanto, parece que la authentication en la class de testing no se inyecta en la llamada del controller.

¿Hice algo mal o cómo solucionarlo?

Debería usar MockMvcBuilders.webAppContextSetup(this.context!!) .apply(springSecurity(springSecurityFilterChain))

springSecurityFilterChain está autoconectado con @EnableWebSecurity

después de eso puedo usar csrf y el usuario que deseo, userDetail se inyecta en el controller.

reference: http://docs.spring.io/spring-security/site/docs/current/reference/html/test-mockmvc.html#test-mockmvc-setup