一段時間以來,我一直在努力為我的休息控制器進行 JUnit 測驗。出于某種原因,每次我嘗試運行它們時都會出現錯誤Status expected:<200> but was:<404>。這是我的控制器:
@RestController
@RequestMapping("/travels")
@RequiredArgsConstructor
public class TravelController {
private final TravelService travelService;
private final TravelOutputDtoMapper travelOutputDtoMapper;
@GetMapping
public List<TravelOutputDto> getAll() {
List<Travel> travels = travelService.getAll();
return travels.stream()
.map(travelOutputDtoMapper::travelToTravelOutputDto)
.collect(Collectors.toList());
}
}
這是我的測驗:
@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = TravelController.class)
@ContextConfiguration(classes = {
TravelOutputDtoMapper.class,
TravelOutputDtoMapperImpl.class
})
class TravelControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private TravelService travelService;
@Autowired
private TravelOutputDtoMapper travelOutputDtoMapper;
@Test
void testGetAll() throws Exception {
List<Travel> travels = mockTravelList();
Mockito.when(travelService.getAll()).thenReturn(travels);
mockMvc.perform(get("/travels"))
.andExpect(status().isOk());
}
private List<Travel> mockTravelList() {
// Dummy travel list
}
}
我認為原因與 TravelOutputDtoMapper 相關,就好像我將它從控制器中洗掉并且不嘗試將它注入測驗正在通過,但我找不到任何資訊為什么它會這樣做。自動裝配的映射器有一個實體并且作業得很好。
這是映射器:
@Mapper(componentModel = "spring")
public interface TravelOutputDtoMapper {
@Mapping(target = "from", source = "entity.from.code")
@Mapping(target = "to", source = "entity.to.code")
TravelOutputDto travelToTravelOutputDto(Travel entity);
}
uj5u.com熱心網友回復:
該@ContextConfiguration注釋用于不同的目的:
@ContextConfiguration 定義了類級別的元資料,用于確定如何為集成測驗加載和配置 ApplicationContext。
使用 Spring Boot,@WebMvcTest無需手動指定如何加載背景關系。這是在后臺為您完成的。
如果要使用此批注,則應在此處指定主要的 Spring Boot 類(帶有@SpringBootApplication批注的入口點類)。
從我在你的測驗和你的問題中可以看到的是,你想為 提供一個實際的 bean TravelOutputDtoMapper,但模擬TravelService.
在這種情況下,您可以使用@TestConfiguration向切片的 Spring TestContext 添加更多 bean:
// @ExtendWith(SpringExtension.class) can be removed. This extension is already registered with @WebMvcTest
@WebMvcTest(controllers = TravelController.class)
class TravelControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private TravelService travelService;
@Autowired
private TravelOutputDtoMapper travelOutputDtoMapper;
@TestConfiguration
static class TestConfig {
@Bean
public TravelOutputDtoMapper travelOutputDtoMapper() {
return new TravelOutputDtoMapper(); // I assume your mapper has no collaborators
}
}
// ... your MockMvc tests
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/345448.html
上一篇:為什么堆使用量不斷增加?
下一篇:FormUrlEncodedPOST請求,我需要使用SpringBoot和Jackson將snakecase值轉換為camelCase
