Spring Boot Controller отличается по поведению при вызове из аннотированного теста @MvcTest

У меня в Spring (2.0.5) есть следующий контроллер

@RestController
public class FaqController {
    @GetMapping("/faqs")
    public void get(@RequestParam("language") final Locale locale) {
        System.out.println(locale);
    }
}

Когда я выполняю запрос GET через Postman / cURL, используя url: http://localhost:8080/faqs?language, вызывается метод контроллера, а locale - это null.

Когда я выполняю тот же URL-адрес с аннотированным тестом JUnit @MvcTest, который выглядит так:

@RunWith(SpringRunner.class)
@WebMvcTest
public class FaqControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test() throws Exception {
        this.mockMvc.perform(get("/faqs?language"));
    }
}

тогда вызывается метод нет, вместо этого вызывается org.springframework.web.bind.MissingServletRequestParameterException с сообщением: Отсутствует обязательный параметр языкового стандарта 'language'.

Почему такая разница? Я что-то упускаю?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
55
1

Ответы 1

Вы хотите, чтобы он был нулевым? Если он не нужен, либо удалите его, либо установите значение «Не требуется».

@RestController
public class FaqController {

   @GetMapping("/faqs")
   public void get(@RequestParam( value = "language", required = false ) final Locale locale) {
       System.out.println(locale);
   }
}

Я предпочитаю исключение нулю. Но в любом случае мне больше интересно узнать, почему такая несогласованность в обработке параметров запроса такого типа.

hms 03.10.2018 21:29

Да, довольно странно, я удивлен, что вы не получаете исключения, когда попадаете в конечную точку с нулевым значением Local. По умолчанию должно быть required = true.

RobOhRob 03.10.2018 22:31

Я получаю исключение, но только когда тестовый пример попадает в конечную точку. При ударе Postman / cURL я получаю нуль.

hms 03.10.2018 22:40

Да, вы также должны получать исключение, когда нажимаете его с помощью Postman, потому что по умолчанию требуется requestParam, если он явно не установлен required = false.

RobOhRob 04.10.2018 15:51

Другие вопросы по теме