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

zdwk9cvp  于 2023-09-29  发布在  Spring
关注(0)|答案(4)|浏览(101)

我有一个使用JPA存储库(CrudRepository接口)的Spring App。当我尝试使用新的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.
wwodge7n

wwodge7n1#

医生说
使用此注解将禁用完全自动配置,而仅应用与MVC测试相关的配置(即@Controller、@ControllerAdvice、@JsonComponent Filter、WebMvcConfigurer和HandlerMethodArgumentResolver beans,但不包括@Component、@Service或@Repository beans)。
此注解仅适用于Spring MVC组件。
如果您希望加载完整的应用程序配置并使用MockMVC,则应该考虑将@SpringBootTest@AutoConfigureMockMvc结合使用,而不是使用此注解。

wr98u20j

wr98u20j2#

我能够通过实现junit 5并使用@SpringJUnitConfig沿着@WebMvcTest对Rest控制器进行单元测试。我使用Sping 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

mccptt67

mccptt673#

我也面临着同样的问题。使用@SpringBootTest@AutoConfigureMockMvc非常适合我。

6tqwzwtp

6tqwzwtp4#

您应该手动配置Data Jpa(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.java-config),然后在测试文件中使用@Import annotation,而不是使用@SpringBootTest加载系统中的所有bean,这将在运行测试时花费大量时间和资源

相关问题