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

Posted

技术标签:

【中文标题】Spring Annotation @WebMvcTest 在具有 Jpa 存储库的应用程序中不起作用【英文标题】:Spring Annotation @WebMvcTest does not work in an app that has Jpa repositories 【发布时间】:2017-02-18 10:08:59 【问题描述】:

我有一个使用 JPA 存储库(CrudRepository 接口)的 Spring 应用程序。当我尝试使用新的 Spring 测试语法 @WebMvcTest(MyController.class) 测试我的控制器时,它失败了,因为它试图实例化我的一个使用 JPA 存储库的服务类,有没有人知道如何解决这个问题?该应用程序在我运行时运行。

这是错误:

***************************
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.

【问题讨论】:

请分享您的 pom.xml 并完成堆栈跟踪以深入了解。 【参考方案1】:

根据文档

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

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

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

【讨论】:

是的,你是对的,我最终使用了你提到的方法,并且有效。 文档链接。 docs.spring.io/spring-boot/docs/current/api/org/springframework/…【参考方案2】:

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

【讨论】:

【参考方案3】:

我能够通过实现 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

【讨论】:

以上是关于Spring Annotation @WebMvcTest 在具有 Jpa 存储库的应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Maven 依赖 spring-web 与 spring-webmvc

Spring-Security OAuth WebMVC 无效的 CORS 请求

spring roo 中的 webmvc-config.xml 在哪里

使用spring webMVC和spring security的ajax登录

使用 Shiro 和 Spring WebMVC (Java8, Spring 4.x) 从 WebApp 中注销所有仍然登录的用户

SpringMVC集成WebMVC执行流程数据响应数据交互