Spring integration test — не введен параметр аутентификации

#kotlin #spring-test #spring-test-mvc

#kotlin #весенний тест #spring-test-mvc

Вопрос:

Я пытаюсь использовать kotlin в своем проекте, который является конечными точками REST API, обслуживающими интерфейс angularjs. И я использую spring rest doc для нашего документа api.

Во время миграции я обнаружил, что мой контекст безопасности не вводится в тестовый пример.

Тестовый класс с mockito-kotlin (в основном преобразован 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

@Autowired
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
}

@Autowired
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....
  

Контроллер:

 @RequestMapping("/myloginURL")
@RestController
class UserLoginController
@Autowired 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)
}

}
  

Здесь userDetail не null , а userDetail.userId null . Таким образом, похоже, что аутентификация в тестовом классе не вводится в вызов контроллера.

Я сделал что-то не так или как это исправить?

Комментарии:

1. Моя ошибка, это НЕ проблема, связанная с kotlin. Java ведет себя так же. Однако в kotlin я сделал первый параметр getUserInfo не обнуляемым, есть ли способ правильно ввести UserDetail с помощью Spring?

Ответ №1:

Я должен использовать MockMvcBuilders.webAppContextSetup(this.context!!)
.apply(springSecurity(springSecurityFilterChain))

springSecurityFilterChain автоматически подключается с @EnableWebSecurity

после этого я могу использовать csrf и пользователя, которого я хочу, UserDetail вводится в контроллер.

ссылка: http://docs.spring.io/spring-security/site/docs/current/reference/html/test-mockmvc.html#test-mockmvc-setup

Комментарии:

1. большое вам спасибо, вы спасли мой день этой строкой: springSecurityFilterChain автоматически подключен с помощью @EnableWebSecurity