Я пытался немного поиграть с интеграционным тестом в Springboot, поэтому я создал образец теста, используя аннотацию @SpringBootTest
. Мой образец теста:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = IntegrationTestConfig.class)
public class WeatherForCityIT {
@Autowired
private TestRestTemplate restTemplate;
@Test
public void getWeatherForExistingCity() throws Exception {
String existingCity = "London";
ResponseEntity<String> responseEntity = restTemplate.getForEntity("/weather/{cityName}",String.class,existingCity.toString());
Assertions.assertThat(responseEntity).isNotNull();
}
}
И иметь следующий класс контроллера
@RestController
@RequestMapping("/weather")
public class ChartController {
private WeatherForecastAPI weatherForecastAPI;
@Autowired
public void setWeatherForecastAPI(WeatherForecastAPI weatherForecastAPI) {
this.weatherForecastAPI = weatherForecastAPI;
}
@GetMapping("/{cityName}")
public List<WeatherForecastDTO> get5daysForecast(@PathVariable String cityName) {
weatherForecastAPI.getWeatherForecastByCity(cityWithCountryCode.toString());
}
}
К сожалению, в теле ответа я получаю сообщение 404 Not Found. В режиме отладки я вижу, что он никогда не достигает определенного контроллера. Я что-то упустил с точки зрения конфигурации? Я также пытался использовать MockMvc:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
@ContextConfiguration(classes = IntegrationTestConfig.class)
public class WeatherForCityIT {
@Autowired
private MockMvc mockMvc;
@Test
public void getWeatherForExistingCity() throws Exception {
String existingCity = "London";
restTemplate.getForEntity("/weather/{cityName}",String.class,existingCity);
mockMvc.perform(get("/weather/" + existingCity))
.andDo(print())
.andExpect(MockMvcResultMatchers.status().isOk());
}
}
но тоже безуспешно (опять 404 вместо 202).
ОТРЕДАКТИРОВАНО
Класс конфигурации выглядит следующим образом:
@Configuration
@EnableAutoConfiguration
public class IntegrationTestConfig {
@Bean
public com.jayway.jsonpath.Configuration configuration() {
return com.jayway.jsonpath.Configuration.builder()
.jsonProvider(new JacksonJsonProvider())
.mappingProvider(new JacksonMappingProvider())
.options(EnumSet.noneOf(Option.class))
.build();
}
}
RequestMappingHandlerMapping.getHandlerMethods().keySet();
. Проверьте, есть ли в этом списке путь /weather/{cityName}. - person Igor   schedule 30.11.2017No qualifying bean of type 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping' available
, это приводит меня к этому, я не вставил сюда полный код. Я пропускаю@ConfigurationContext
, указывающий на пустой класс конфигурации. Когда я удаляю это, то все работает нормально. Почему это ? Почему указание класса конфигурации вызывает эту ошибку? - person Artur Skrzydło   schedule 30.11.2017@ContextConfiguration
вы указываете, какие@Configuration
классы нужно загрузить для настройки вашего ApplicationContext в ваших тестах. Обычно вам это не нужно при тестировании приложений Spring Boot.@SpringBootTest
автоматически выполнит поиск вашей основной конфигурации в классе с аннотацией@SpringBootApplication
. Если вам нужно настроить вашу основную конфигурацию, лучше использовать класс@TestConfiguration
. Вы можете узнать больше здесь а>. - person Igor   schedule 30.11.2017@TestConfiguration
для вложенной конфигурации - person Artur Skrzydło   schedule 30.11.2017@TestConfiguration
вместо@Configuration
. - person Igor   schedule 30.11.2017@SpringBootTest(classes = {IntegrationTestConfig.class}, ...)
или@ContextConfiguration(classes = IntegrationTestConfig.class)
, как в вашем примере кода? - person Igor   schedule 30.11.2017