Весенняя аннотация @WebMvcTest не работает в приложении с репозиториями Jpa

#spring #spring-mvc #spring-boot #spring-data-jpa #spring-test-mvc

#spring #spring-mvc #весенняя загрузка #spring-data-jpa #spring-test-mvc

Вопрос:

У меня есть приложение Spring, которое использует репозитории ( CrudRepository интерфейсы) JPA. Когда я пытаюсь протестировать свой контроллер, используя новый синтаксис Spring test @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.
  

Комментарии:

1. Пожалуйста, поделитесь своим pom.xml и завершите трассировку стека до глубокого погружения.

Ответ №1:

Согласно документу

Использование этой аннотации отключит полную автоматическую настройку и вместо этого применит только конфигурацию, относящуюся к тестам MVC (т.Е. @Controller, @ControllerAdvice, @JsonComponent Filter, компоненты WebMvcConfigurer и HandlerMethodArgumentResolver, но не компоненты @Component, @Service или @Repository).

Это уведомление применяется только к компонентам Spring MVC.

Если вы хотите загрузить полную конфигурацию приложения и использовать MockMvc, вам следует подумать @SpringBootTest о сочетании с @AutoConfigureMockMvc , а не с этой аннотацией.

Комментарии:

1. Да, вы правы, в итоге я использовал метод, который вы упомянули, и он работает.

2. Ссылка на документы. docs.spring.io/spring-boot/docs/current/api/org/springframework /…

Ответ №2:

Я смог выполнить модульное тестирование контроллера Rest, внедрив junit 5 и используя @SpringJUnitConfig вместе с @WebMvcTest . Я использую 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 при реализации интеграционных тестов.

Ответ №3:

Я столкнулся с той же проблемой. Использование @SpringBootTest и @AutoConfigureMockMvc отлично работало для меня.