#spring-boot #unit-testing #spring-mvc #spring-data-jpa #spring-data
Вопрос:
Я получаю следующую ошибку в тесте контроллера, который я написал:
Вызвано: org.springframework.фасоль.фабрика.Исключение NoSuchBeanDefinitionException: Нет подходящего компонента типа «javax.sql.Источник данных»: ожидается, что по крайней мере 1 компонент, который квалифицируется как кандидат на автоматическое подключение. Аннотации зависимостей: {@org.springframework.beans.factory.аннотация.Автоматическая проводка(требуется=true)} в org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1790) ~[весенние бобы-5.3.8.jar:5.3.8] в организации.пружинная конструкция.фасоль.завод.поддержка.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1346) ~[spring-beans-5.3.8.jar:5.3.8] в org.springframework.beans.factory.поддержка.DefaultListableBeanFactory.Разрешенная зависимость(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.8.jar:5.3.8] в org.springframework.beans.factory.аннотация.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657) ~[спринг-бобы-5.3.8.баночка:5.3.8]
само приложение работает нормально. Я настроил источник данных (MySQL) в application.properties
— программно не настраивал для него компонент, и никаких проблем с dataSource
запуском самого приложения не возникало.
Зависимости следующие: (опущены несущественные)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
Тестовый класс имеет следующую конфигурацию —
@WebMvcTest(UserController.class)
@TestPropertySource(locations = "classpath:application-integrationtest.properties")
public class UserControllerTest {
@MockBean private UserService userService;
@MockBean private UserRepository userRepository;
@Autowired private MockMvc mockMvc;
...
приложение-integrationtest.properties имеет все и только следующее —
spring.datasource.url=jdbc:h2:mem:test
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.datasource.driver-class-name=org.h2.Driver
что я упускаю??
что делать, если я настрою DataSource
компонент в коде-где я это делаю? Приложение работает повсюду без таких ошибок. Как я могу определить DataSource
для тестового использования без каких DataSource
-либо изменений в домене приложения ?
любая помощь будет признательна.
Не слишком разбираюсь в последней версии-прошло некоторое время с момента настройки Spring boot. Измотал меня.
Комментарии:
1. Вам вообще не должен понадобиться источник данных при использовании an
@WebMvcTest
. Это означает, что вы, вероятно, возитесь с вещами, которые вам не следует заставлять работать с тестированием среза. Я бы заподозрил, что вам понадобится только макет дляUserService
не хранилища.2. @M. Deinum — он делает то же самое без хранилища. на самом деле, я поместил туда репозиторий, чтобы проверить, исправится ли он.
3. @M. Deinum любые предложения, где искать —SecurityConfig, конфигурация MySQL(application.properties).. ? я настроил все это в значительной степени стандартным способом. я не могу думать ни о чем другом, кроме вышеперечисленных 2
4. Очевидно, ваша служба зависит от источника данных, иначе она не просила бы об этом. Если у вас нет слишком большой конфигурации
@SpringBootApplication
, и платформа тестирования не может отключить части конфигурации. В целом, здесь слишком мало информации, чтобы ответить на этот вопрос.