首页 > 解决方案 > 由于没有可见的构造函数,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 被注释为主要的,因为应用程序中有另一个数据源。我们使用两个数据库。

那么我该怎么做才能让我的测试运行呢?我不太明白这里的问题。

标签: springspring-data-jpaspring-test

解决方案


推荐阅读