【问题标题】:Spring Boot JUnit tests fail with Status expected:<200> but was:<404>Spring Boot JUnit 测试失败,Status expected:<200> but was:<404>
【发布时间】:2021-12-15 18:39:36
【问题描述】:

一段时间以来,我一直在努力为我的休息控制器进行 JUnit 测试。出于某种原因,每次我尝试运行它们时都会收到错误Status expected:&lt;200&gt; but was:&lt;404&gt;。这是我的控制器:

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

【问题讨论】:

  • 可以添加TravelOutputDtoMapper的代码吗?谢谢!
  • @JoãoDias 我已经用它更新了我的问题
  • 您是否在 application.properties 中为应用程序使用上下文?
  • 是的,我已经链接了我的 maven 和 spring 配置文件,并将它们分成两个不同的配置,但是在测试 application.yml 中我已经覆盖了所有配置。

标签: spring spring-mvc junit spring-test mapstruct


【解决方案1】:

@ContextConfiguration 注释用于不同的目的:

@ContextConfiguration 定义了类级元数据,用于确定如何为集成测试加载和配置 ApplicationContext。

使用 Spring Boot 和 @WebMvcTest 无需手动指定如何加载上下文。这是在后台为您完成的。

如果您要使用此注解,您需要在此处指定您的主 Spring Boot 类(您的入口点类带有 @SpringBootApplication 注解)。

根据我在您的测试中看到的情况,您的问题是您想为TravelOutputDtoMapper 提供一个实际的bean,但要模拟TravelService

在这种情况下,您可以使用 @TestConfiguration 将更多 bean 添加到切片的 Spring TestContext:

// @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
}

【讨论】:

  • 感谢您提供的信息。它适用于您的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多