gpt4 book ai didi

Spring Boot - Controller 测试失败并出现 404 代码

转载 作者:行者123 更新时间:2023-12-03 14:35:47 24 4
gpt4 key购买 nike

我想为 Controller 编写一个测试。这是测试片段:

@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());
}
}

Controller 代码片段:
@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);
}

模拟配置类:
@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

我可以在这里找到问题所在。
如何修复 Controller 的测试?

最佳答案

HTTP code 404 , 表示没有为您的请求找到资源(在服务器上),我认为您的 Controller 在 spring boot 中是不可见的(我说没有被扫描)。

一个简单的解决方案是扫描 MockConfig 中的父包上课,所以 Spring 可以捡到所有的 bean ,

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

如果你不喜欢这种方式,你可以在 basePackages 中添加 Controller 的包名
@ComponentScan(basePackages = {"edu.lelyak.controller","edu.lelyak.repository") 

顺便说一句,您不必手动设置 WeatherStationServiceMockConfig类,Spring boot 可以为你注入(inject)一个 mock 并在每个测试方法之后自动重置它,你应该在你的测试类中声明它:
@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);

您可以在以下位置找到更多信息:
  • Testing improvements in Spring Boot 1.4
  • Spring Boot features: Testing
  • 关于Spring Boot - Controller 测试失败并出现 404 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41548771/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com