Spring注释@WebMvcTest在具有Jpa存储库的应用程序中不起作用

时间:2016-10-10 02:40:18

标签: spring spring-mvc spring-boot spring-data-jpa spring-test-mvc

我有一个使用JPA存储库(CrudRepository接口)的Spring应用程序。当我尝试使用新的Spring测试语法@WebMvcTest(MyController.class)测试我的控制器时,它失败了因为它试图实例化我的一个使用JPA Repository的服务类,是否有人有任何关于如何修复它的线索?该应用程序在我运行时有效。

这是错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.myapp.service.UserServiceImpl required a bean of type 'com.myapp.repository.UserRepository' that could not be found.

Action:

Consider defining a bean of type 'com.myapp.repository.UserRepository' in your configuration.

3 个答案:

答案 0 :(得分:4)

根据文件

  

使用此注释将禁用完全自动配置,而是仅应用与MVC测试相关的配置(即@ Controller,@ ControllerAdvice,@ JsonComponent Filter,WebMvcConfigurer和HandlerMethodArgumentResolver bean,但不包括@Component,@ Service或@Repository bean)。

此注释仅适用于Spring MVC组件。

如果您要加载完整的应用程序配置并使用MockMVC,则应考虑将@SpringBootTest@AutoConfigureMockMvc结合使用而不是此注释。

答案 1 :(得分:1)

通过实现 junit 5 并使用 @SpringJUnitConfig@WebMvcTest,我能够对 Rest Controller 进行单元测试。我使用的是 Spring Boot 2.4.5,这是我的示例:

@SpringJUnitConfig
@WebMvcTest(controllers = OrderController.class)
class OrderControllerTest {

    @Autowired
    private MockMvc mockMvc;

    // This is a Mock bean of a Spring Feign client that calls an external Rest Api
    @MockBean
    private LoginServiceClient loginServiceClient;

    // This is a Mock for a class which has several Spring Jpa repositories classes as dependencies
    @MockBean
    private OrderService orderService;

    @DisplayName("should create an order")
    @Test
    void createOrder() throws Exception {

        OrderEntity createdOrder = new OrderEntity("123")

        when(orderService.createOrder(any(Order.class))).thenReturn(createdOrder);

        mockMvc.perform(post("/api/v1/orders").contentType(MediaType.APPLICATION_JSON).content("{orderId:123}"))
            .andExpect(status().isCreated())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))TODO: here it will go the correlationId
            .andExpect(jsonPath("$.orderId").value("123"));
    }
}

请仅在实施集成测试时使用 @SpringBootTest

答案 2 :(得分:0)

我遇到了同样的问题。使用@SpringBootTest@AutoConfigureMockMvc对我来说非常合适。