首页 > 解决方案 > DataJpaTest 与 MySQL TestContainer 上的 liquibase

问题描述

是否可以设置一个@DataJpaTest使用 liquibase 和临时 MySQL 的 Spring(因此我们可以使用 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.

标签: mysqlspringtestingliquibase

解决方案


而不是@Rule使用@ClassRule并创建一个配置类来提供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);

    }
}


推荐阅读