gpt4 book ai didi

java - 多个数据源的Spring Boot测试配置

转载 作者:行者123 更新时间:2023-12-05 07:01:19 26 4
gpt4 key购买 nike

所以我正在尝试为我的 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

对于我的基本测试,我正在尝试测试一个简单的服务,该服务会注入(inject)这些已配置的存储库之一。这看起来像这样:

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 有关,但不知道为什么会这样。有什么想法吗?

最佳答案

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

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

关于java - 多个数据源的Spring Boot测试配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63898656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com