Как настроить HandlerMethodArgumentResolver в весеннем загрузочном тесте

Пишу модуль для контроллера с spting boot @WebMvcTest.

Используя @WebMvcTest, я смогу внедрить объект MockMvc, как показано ниже: -

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {TestConfig.class})
@WebMvcTest
class MyControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void my_controller_test() throws Exception {
       mockMvc.perform(post("/create-user"))
              .andExpect(status().isCreated());
    }
}

В контроллере я ввожу аргумент Principal, используя spring HandlerMethodArgumentResolver. Пожалуйста, сообщите мне, как я могу написать модульный тест с MockMvc , чтобы я мог внедрить фиктивный объект Principal в качестве аргумента в методе контроллера.

Раздел Автоматически настроенные тесты Spring MVC поясняет, что тест с аннотацией @WebMvcTest будет сканировать bean-компоненты HandlerMethodArgumentResolver. Итак, я создал bean-компонент, который расширяет HandlerMethodArgumentResolver и возвращает фиктивный объект Principal, как показано ниже.

@Component
public class MockPrincipalArgumentResolver implements HandlerMethodArgumentResolver {
   @Override
   public boolean supportsParameter(MethodParameter parameter) {
     return parameter.getParameterType().equals(Principal.class);
   }

   @Override
   public Object resolveArgument(MethodParameter parameter...) throws Exception {
     return new MockPrincipal();
   }
 }

Но все же аргумент MockPrincipal не передается методу контроллера.

Весенняя загрузочная версия: - 1.4.5.RELEASE


person Manu    schedule 17.07.2017    source источник
comment
Вам нужно указать принципала в запросе, который вы делаете, а не создавать дополнительный HandlerMethodArgumentResolver. post(/your-url).principal(new MockPrincipal()).   -  person M. Deinum    schedule 17.07.2017
comment
Большое спасибо. Я зря потратил время на поиски других вариантов :). Если вы не против, не могли бы вы упомянуть, где это задокументировано?   -  person Manu    schedule 17.07.2017


Ответы (1)


Вы используете MockMvc для вызова контроллера. При этом вы должны подготовить запрос с такими вещами, как параметры, тело, URL-адрес, а также принципал. То, что вы не укажете, не будет включено (теперь вы в основном выполняете вызов без аутентифицированного принципала).

Поддержка Spring MVC Testing для MockMvc в целом задокументирован в справочном руководстве.

Для получения более подробной информации проверьте компонент, который используется для создания фиктивного запроса, в MockHttpServletRequestBuilder. Это то, что вернет ваш метод post, который должен быть вызовом MockHttpServletRequestBuilders.post (и, возможно, статическим импортом в вашем коде). [CTRL]+[ПРОБЕЛ] (или любой другой ваш любимый ярлык завершения кода в вашей iDE) после post() даст вам некоторое представление о том, что доступно.

@Test
public void my_controller_test() throws Exception {
   mockMvc.perform(post("/create-user").principal(new MockPrincipal())
          .andExpect(status().isCreated());
}

Что-то вроде приведенного выше должно помочь.

person M. Deinum    schedule 17.07.2017