spring - 由于没有可见的构造函数,Spring Data Unit Test 无法实例化 EntityManagerFactory
问题描述
我想测试我的 spring 存储库并遇到了一个似乎经常出现的问题。但遗憾的是,到目前为止我找不到解决方案。
当我运行我的单元测试时,会引发此异常:
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;
}
.
.
.
}
这些 bean 被注释为主要的,因为应用程序中有另一个数据源。我们使用两个数据库。
那么我该怎么做才能让我的测试运行呢?我不太明白这里的问题。
解决方案
推荐阅读
- java - 使用java在同一程序中升序和降序
- java - Android Volley:javax.net.ssl.SSLHandshakeException:(API URL 从 http 更改为 https)
- robot - 什么是用于创建机器人的编程语言?
- python - 使用换行文本保存的 Excel 文件在 Libreoffice 和 soffice 中打开而不换行
- javascript - 更改标题属性的字体系列
- vb.net - 在 rdlc 报告表行中显示动态外部图像
- apache-kafka-streams - 如何在处理器 API 中创建 GlobalKTable?
- amazon-web-services - AWS ELB 粘性导致 NGINX 具有无缓存行为
- android - 通过单击 nav_header_main 更改片段
- typescript - 如何在打字稿中调用自有函数