2017-01-09 2 views
0

Я хочу написать тест для контроллера. Вот тест сниппет:Spring Boot - Тест для контроллера не с кодом 404

@RunWith(SpringRunner.class) 
@WebMvcTest(WeatherStationController.class) 
@ContextConfiguration(classes = MockConfig.class) 
public class WeatherStationControllerTest { 

    @Autowired 
    private MockMvc mockMvc; 

    @Autowired 
    private IStationRepository stationRepository; 

    @Test 
    public void shouldReturnCorrectStation() throws Exception { 

     mockMvc.perform(get("/stations") 
       .accept(MediaType.APPLICATION_JSON)) 
       .andExpect(status().isOk()); 
    } 
} 

контроллер фрагмент кода:

@RestController 
@RequestMapping(value = "stations") 
public class WeatherStationController { 

    @Autowired 
    private WeatherStationService weatherService; 

    @RequestMapping(method = RequestMethod.GET) 
    public List<WeatherStation> getAllWeatherStations() { 
     return weatherService.getAllStations(); 
    } 

    @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
    public WeatherStation getWeatherStation(@PathVariable String id) { 
     return weatherService.getStation(id); 
    } 

MockConfig класс:

@Configuration 
@ComponentScan(basePackages = "edu.lelyak.repository") 
public class MockConfig { 

    //**************************** MOCK BEANS ****************************** 

    @Bean 
    @Primary 
    public WeatherStationService weatherServiceMock() { 
     WeatherStationService mock = Mockito.mock(WeatherStationService.class); 
     return mock; 
    } 

Вот ошибка трассировки стека:

java.lang.AssertionError: Status 
Expected :200 
Actual :404 

я могу получить, что здесь неправильно.
Как исправить тест для контроллера?

ответ

1

Вот другой подход к тесту контроллера, который работал для меня. не

Предположение: Класс WeatherStationService является @SpringBootApplication

Затем тестовый класс ниже должен работать для вас:

@RunWith(SpringRunner.class) 
@SpringApplicationConfiguration(WeatherStationService.class) 
@WebIntegrationTest 
public class WeatherStationControllerTest { 

    @Autowired 
    private WebApplicationContext context; 

    MockMvc mockMvc; 

    @Before 
    public void setup() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build(); 
    } 

    @Test 
    public void shouldReturnCorrectStation() throws Exception { 
     mockMvc.perform(get("/stations") 
       .accept(MediaType.APPLICATION_JSON)) 
     .andExpect(status().isOk(); 
    } 
} 

С этой тестовой установкой, вам больше не нужно MockConfig класса.

+0

Я попытался это не помогает. –

+0

Надеюсь, это предложение будет полезно на этот раз, и еще не поздно. – Nkokhelox

1

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

@SpringBootTest 
public class ControllerTest { 

    @Autowired 
    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     this.mockMvc = MockMvcBuilders.standaloneSetup(new TestController()).build(); 
    } 

    @Test 
    public void shouldReturnCorrectStation() throws Exception { 
     mockMvc.perform(get("/stations") 
       .accept(MediaType.APPLICATION_JSON)) 
       .andExpect(status().isOk()); 
    } 
} 
+0

Вот ссылка на полный [контрольный тест] (https://github.com/nazar-art/geo-api-data/blob/master/src/test/java/edu/lelyak/controllers/WeatherStationControllerTest.java) –

+0

как вы посмотрели на полный тест контроллера? –

+0

@nazar_art Я клонировал вам проект github, но он был полон ошибок. Не уверен, правильно ли ваш MockMvc. Я бы пошел простым путем и зарегистрировал один контроллер в вашем тестовом классе, как я уже сказал. – Patrick

1

HTTP code 404, значит ни один ресурс не найден (на сервере) для вашего запроса, который я думаю, что ваш контроллер не виден (позвольте мне сказать, не сканируется) пружинным ботинке.

Простое решение сканирует родительский пакет в MockConfig классе, так что весной может забрать все бобы,

@ComponentScan(basePackages = "edu.lelyak") // assuming that's the parent package in your project 

, если вам не нравится этот подход, вы можете добавить имя пакета контроллера в basePackages

@ComponentScan(basePackages = {"edu.lelyak.controller","edu.lelyak.repository") 

Кстати, вам не придется вручную настроить WeatherStationService в MockConfig класс, весна загрузки может впрыснуть издеваться для вас и автоматически сбрасывается после каждого метода тестирования, вы должны просто отменить Clare его в тестовом классе:

@MockBean 
private IStationRepository stationRepository; 

С другой стороны, вы должны издеваться weatherService.getAllStations() перед вызовом get("/stations") в методе испытания (как вы работаете не integration test), так что вы можете сделать:

List<WeatherStation> myList = ...; 
//Add element(s) to your list 
Mockito.when(stationService.getAllStations()).thenReturn(myList); 

Вы можете найти больше:

Смежные вопросы