DataJpaTest с жидкой базой на MySQL TestContainer - PullRequest
1 голос
/ 09 апреля 2020

Можно ли установить Spring @DataJpaTest, который использует жидкостную базу с временным MySQL (поэтому мы можем использовать MySQL Speci c функции и синтаксис).

Я думал чтобы сделать это, мне пришлось бы использовать 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.

1 Ответ

1 голос
/ 10 апреля 2020

Вместо @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);

    }
}

...