如何为Springboot集成测试配置数据库映像

q5iwbnjs  于 2022-12-18  发布在  Spring
关注(0)|答案(1)|浏览(172)

有一种情况,我想使用一个数据库映像来集成测试我的服务层。下面是我开发的代码来设置我的Postgres容器映像:

@SpringBootTest(classes = EventhandlerApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public abstract class BaseIT {

public static final PostgreSQLContainer<?> postgresDB = new PostgreSQLContainer<>
        ("postgres:12-alpine")
        .withDatabaseName("test-db")
        .withUsername("postgres")
        .withPassword("password");

static {
    postgresDB.start();
}

@DynamicPropertySource
public static void properties(DynamicPropertyRegistry registry) {
    registry.add("spring.datasource.url", postgresDB::getJdbcUrl);
    registry.add("spring.datasource.username", postgresDB::getUsername);
    registry.add("spring.datasource.password", postgresDB::getPassword);
}
}

现在我想使用测试数据库来调用我的服务层方法并检查结果,下面是我的集成测试示例:

public class SampleServiceTesting extends BaseIT {

@Autowired
private SampleService sampleService;

@Test
@Transactional
void testIntegrationFlow() {
    SampleService.exampleMethod();
}
}

但当我运行测试时,它返回以下错误:

org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set


我如何才能解决这个问题上运行我的测试请?

qpgpyjmq

qpgpyjmq1#

你问的
使用PostgreSQL容器在测试容器中体验HibernateException
问题在于没有通过连接池到数据库的活动连接,这也可能导致PostgreSQLContainer的配置错误和错误注入,因为Hibernate可以自动确定要使用的正确方言,为此,它需要到数据库的活动连接。
一种做法是使用ApplicationContextInitializer接口而不是@DynamicPropertySource以编程方式初始化应用程序上下文。例如,注册数据源或根据上下文环境激活概要文件。一种做法如下所示。

static class PropertyInitializer
   implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
        TestPropertyValues.of(
          "spring.datasource.url=" + postgresDB.getJdbcUrl(),
          "spring.datasource.username=" + postgresDB.getUsername(),
          "spring.datasource.password=" + postgresDB.getPassword()
        ).applyTo(configurableApplicationContext.getEnvironment());
    }
}

相关问题