#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
отлично работало для меня.