Spring Boot多数据源测试配置

3

我正在尝试为我的Spring Boot应用程序引入一些单元测试,并且我正在努力设置测试环境的配置。我的应用程序已配置为连接两个不同的Postgres数据库,如下所示:

application.properties

spring.db1-datasource.jdbc-url= jdbc:postgresql://localhost:5432/db1
spring.db1-datasource.username= admin
spring.db1-datasource.password= admin
spring.db1-datasource.driverClassName= org.postgresql.Driver

spring.db2-datasource.jdbc-url= jdbc:postgresql://localhost:5432/db2
spring.db2-datasource.username= admin
spring.db2-datasource.password= admin
spring.db2-datasource.driverClassName= org.postgresql.Driver

FirstDbConfig.java

@Configuration
@PropertySource({"classpath:application.properties"})
@EnableJpaRepositories(
        basePackages = "org.myapp.database.db1.repository",
        entityManagerFactoryRef = "firstEntityManager",
        transactionManagerRef = "firstTransactionManager")
public class FirstDbConfig {
    @Autowired
    private Environment env;

    public FirstDbConfig() {
        super();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean firstEntityManager() {
        final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(firstDataSource());
        em.setPackagesToScan("org.myapp.database.db1");

        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        final HashMap<String, Object> properties = new HashMap<String, Object>();
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
        properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Bean
    @ConfigurationProperties(prefix="spring.db1-datasource")
    public DataSource firstDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public PlatformTransactionManager firstTransactionManager() {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(firstEntityManager().getObject());
        return transactionManager;
    }
}

SecondDbConfig.java

这里不包括它,因为它与上一个很相似。目标是 org.myapp.database.db2.repository

在我的基本测试中,我试图测试一个注入了其中一个配置的repository的简单service。代码如下:

MyServiceTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MyService.class)
@ContextConfiguration(
        classes = {FirstDbConfig.class, SecondDbConfig.class },
        loader= AnnotationConfigContextLoader.class
)
public class MyServiceTest {

    @InjectMocks
    private MyService myService;

    @Mock
    private FirstDbRepository dbRepository;

    @Test
    public void test() {
        ...
        // call to myService.method()
    }
}

测试失败,报错信息如下:

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set at ...

这显然与未设置hibernate.dialect有关,但不知道为什么会出现这种情况。有什么想法吗?


是时候重新检查数据库了。它是否在本地运行并监听?它是否正在5432端口上监听?schemas db1和db2是否实际存在其中?凭据是否正确?原因是此错误意味着无法自动检测必要的细节-因此,您需要自己提供这些细节,但这并没有帮助,因为存在问题导致无法自动检测。 - Gimby
@Gimby,所有东西都正常运行,在开发环境中完美地工作。 - pirox22
但是这些测试是否在同一个开发环境上运行? - Gimby
3个回答

0
需要将以下内容加入到 application.properties 文件中: spring.jpa.database=default

0

你需要设置环境属性 hibernate.dialect,因为你试图在代码中获取它的值。


0

是的,我们需要包含这个Hibernate方言,请尝试在您的application.properties文件中包含这两行

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto = update

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接