DataJpaTest with with liquibase on MySQL TestContainer

DataJpaTest with with liquibase on MySQL TestContainer

是否可以设置一个 Spring @DataJpaTest,它使用带有临时 MySQL 的 liquibase(这样我们就可以使用 MySQL 特定的函数和语法)。

我在想,要做到这一点,我必须使用 testcontainers 为测试创建一个临时 MySQL 实例,并以某种方式配置 DataJpaTest 以使用嵌入式实例。

@RunWith(SpringRunner.class)
@ContextConfiguration(
    classes = {
        BlankJpaTest.class
    }
)
@EnableJpaRepositories(
    basePackageClasses = {
        Organizations.class
    }
)
@EntityScan(
    basePackageClasses = {
        Organization.class
    }
)
@DataJpaTest(
    properties = {
        "spring.datasource.url=jdbc:tc:mysql:5.6.23:///databasename"
    }
)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class BlankJpaTest {
    @Rule
    public MySQLContainer mysql = new MySQLContainer();

    @Autowired
    private EntityManager entityManager;

    @Test
    public void test() {

    }
}

但是,我得到以下结果

***************************
APPLICATION FAILED TO START
***************************

Description:

A component required a bean named 'entityManagerFactory' that could not be found.

而不是 @Rule,使用 @ClassRule 并创建一个配置 class 来提供 DataSource.

@RunWith(SpringRunner.class)
@ContextConfiguration(
    classes = {
        BlankJpaTest.class,
        BlankJpaTest.Config.class
    }
)
@EnableJpaRepositories(
    basePackageClasses = {
        Organizations.class
    }
)
@EntityScan(
    basePackageClasses = {
        Organization.class
    }
)
@DataJpaTest(
    properties = {
        "spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl"
    }
)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@EnableTransactionManagement
public class BlankJpaTest {
    @ClassRule
    public static MySQLContainer mysql = new MySQLContainer();

    @Autowired
    private Organizations organizations;

    @Configuration
    static class Config {
        @Bean
        public DataSource dataSource() {

            final DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setUrl(mysql.getJdbcUrl());
            dataSource.setUsername(mysql.getUsername());
            dataSource.setPassword(mysql.getPassword());
            return dataSource;

        }
    }

    @Test
    public void test() {
        assertThat(organizations.findAll())
            .hasSize(2);

    }
}