Путь к сервлету Spring Boot 2.x игнорируется в тесте

#java #spring-boot #spring-mvc

#java #spring-boot #spring-mvc

Вопрос:

в моем приложении-test.properties у меня есть это server.servlet.context-path=/api

Он работает абсолютно нормально, когда я запускаю приложение и тестирую его с помощью postman. Но как только я запускаю свои тесты, он проглатывает часть /api пути.

Итак, в принципе, как это должно быть

localhost:8080/api/testUrl

но контроллер доступен только здесь

localhost:8080/testUrl

Мой заголовок тестового класса

 @ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@AutoConfigureMockMvc
public class QaControllerIntegrationTest {

    private static final String QA_URL = "/api";

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private QaService qaService;

    @Autowired
    private TestRestTemplate testRestTemplate;
  

поведение установки не реализовано.

и тесты (только для полноты картины — они будут работать, если я удалю QA_URL)

  @Test
    void getQuestions() {
        final ResponseEntity<List<QuestionAnswerDTO>> listResponseEntity = testRestTemplate.exchange(
                QA_URL   "/questions", HttpMethod.GET, null, new ParameterizedTypeReference<>() {
                });

        assertThat(listResponseEntity.getStatusCode()).isEqualByComparingTo(HttpStatus.OK);
        assertThat(listResponseEntity.getBody().get(0).getQuestion()).isEqualTo(QUESTION);
    }

    @Test
    void addNewQa() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post(QA_URL   "/question")
                .content(JacksonUtils.toString(questionAnswerDTO, false))
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andDo(print())
                .andExpect(status().isCreated());
    }
  

Что я здесь пропустил, пожалуйста?

Спасибо =)

Ответ №1:

Потому что MockMvc не настроен автоматически с помощью контекстного пути и, следовательно, не знает об этом. Если вы хотите включить его, вы можете сделать:

 MockMvcRequestBuilders.post(QA_URL   "/question").contextPath(QA_URL)
  

Префикс уведомления должен совпадать, чтобы Spring мог вычислить оставшийся путь. Обычно тест не должен заботиться о контексте, в котором они находятся, поэтому контекстный путь никогда не включается.