#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 мог вычислить оставшийся путь. Обычно тест не должен заботиться о контексте, в котором они находятся, поэтому контекстный путь никогда не включается.