mysql - 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.
解决方案
而不是@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);
}
}
推荐阅读
- python - 试图避免使用 tkinter 结合 .pack() 和 .grid() 并挣扎。哪个选项更好,为什么?
- regex - 已解决:哪些 RegexExtract 参数可以提取具有不同长度和格式的数字
- azure-powershell - Powershell 帮助比较
- python - X 轴没有像数据框中那样正确显示
- javascript - Discord.js v12 如何将新创建的角色分配给用户?
- dart - 引用字符串的列表
- sql-server - SQL Server 删除子字符串,直到逗号或右括号
- tomcat - RESTeasy ContainerRequestFilter 部署到tomcat时不包含用户信息(容器管理身份验证)
- flutter - Flutter:我想访问 setstate 的更改值,当我访问它时它没有显示新的状态值
- android - Android - 通过 Intent 启动另一个应用程序时保持演示文稿显示