Я хочу протестировать свои весенние репозитории и столкнулся с проблемой, которая, кажется, появляется довольно часто. Но, к сожалению, я не смог найти решение до сих пор.
Когда я запускаю свои модульные тесты, выдается это исключение:
Factory method 'entityManagerFactory' threw exception; nested exception is java.lang.IllegalArgumentException:
No visible constructors in class org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean
Пример для моих тестовых классов выглядит следующим образом:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes= {OracleJPAConfig.class})
@DataJpaTest
public class AlContainmentsRepositoryTest {
@Autowired
private TestEntityManager testEm;
.
.
.
}
И класс конфигурации, упомянутый выше, таков:
@Configuration
@PropertySource("classpath:database-${xxxxxx.db.profile}.properties")
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager",
basePackages = {"de.xxxxxx.xxxxxx.xxxxxx.data.repository"})
@EnableTransactionManagement
public class OracleJPAConfig {
@Value("${spring.datasource.driver-class-name}")
protected String driverClassName;
@Value("${spring.datasource.url}")
protected String url;
@Value("${spring.datasource.username}")
protected String username;
@Value("${spring.datasource.password}")
protected String password;
@Primary
@SuppressWarnings("unchecked")
@Bean(name="dataSource")
public DataSource dataSource() {
try {
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
Class<? extends Driver> driver = (Class<? extends Driver>) Class.forName("oracle.jdbc.driver.OracleDriver");
dataSource.setDriverClass(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
} catch (ClassNotFoundException e) {
return null;
}
}
@Primary
@Bean(name="entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws SQLException {
final LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
hibernateProperties.put("hibernate.max_fetch_depth", 3);
hibernateProperties.put("hibernate.jdbc.batch_size", 10);
hibernateProperties.put("hibernate.jdvc.fetch_size", 50);
emf.setPackagesToScan("de.xxxxxx.xxxxxx.xxxxxx.data.entity");
emf.setDataSource(dataSource());
emf.setJpaVendorAdapter(vendorAdapter);
emf.setJpaProperties(hibernateProperties);
return emf;
}
.
.
.
}
Бины помечаются как первичные, поскольку в приложении есть другой источник данных. Мы работаем с двумя базами данных.
Итак, что я могу сделать, чтобы мои тесты работали? Я не очень понимаю проблему здесь.