Java junit5中带有@TestContainers的Spring@DataJpaTest
这是一个扩展,主要区别在于添加了测试容器 我尽量把事情控制在最低限度 测试非常简单Java junit5中带有@TestContainers的Spring@DataJpaTest,java,spring,testing,spring-data-jpa,testcontainers,Java,Spring,Testing,Spring Data Jpa,Testcontainers,这是一个扩展,主要区别在于添加了测试容器 我尽量把事情控制在最低限度 测试非常简单 @DataJpaTest @Testcontainers @ContextConfiguration(classes = { DemoApplicationTests.Config.class }) @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) class DemoApplicationTe
@DataJpaTest
@Testcontainers
@ContextConfiguration(classes = {
DemoApplicationTests.Config.class
})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class DemoApplicationTests {
@Autowired
private Artifacts artifacts;
@Test
void contextLoads() {
assertThat(artifacts).isNotNull();
}
@Container
private static final MySQLContainer<?> MYSQL = new MySQLContainer<>("mysql:5.7");
@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());
await().pollInterval(Duration.ofSeconds(2L))
.atMost(Duration.ofMinutes(2L))
.until(() -> {
try (final Connection c = dataSource.getConnection()) {
c.prepareStatement("select 1 from dual");
return true;
} catch (SQLException e) {
return false;
}
});
return dataSource;
}
}
}
但运行测试时,我会得到以下堆栈跟踪段:
原因:java.lang.IllegalStateException:无法检索@EnableAutoConfiguration基本包
位于org.springframework.boot.autoconfigure.AutoConfigurationPackages.get(AutoConfigurationPackages.java:78)
位于org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport.getBasePackages(AbstractRepositoryConfigurationSourceSupport.java:79)
位于org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport$AutoConfiguredAnnotationRepositoryConfigurationSource.getBasePackages(AbstractRepositoryConfigurationSourceSupport.java:138)
位于org.springframework.data.repository.config.RepositoryConfigurationSourceSupport.lambda$getCandidates$2(RepositoryConfigurationSourceSupport.java:82)
我找到了两种方法来实现这一点。一种方法是
@ContextConfiguration(classes = {
DemoApplication.class,
DemoApplicationTests.Config.class
})
它从DemoApplication
加载配置。虽然它通常比较干净,但如果您有其他服务,如EnableRedisRepositories和EnableKafka,测试仍然可能失败,因为这些资源可能没有在脚本中配置
或者可以启用Config
类,以便只执行JPA测试。这是我最终选择的,因为我在从中提取样本的代码上启用了RedisRepositories
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
@EntityScan
static class Config
我找到了两种方法让它工作。一种方法是
@ContextConfiguration(classes = {
DemoApplication.class,
DemoApplicationTests.Config.class
})
它从DemoApplication
加载配置。虽然它通常比较干净,但如果您有其他服务,如EnableRedisRepositories和EnableKafka,测试仍然可能失败,因为这些资源可能没有在脚本中配置
或者可以启用Config
类,以便只执行JPA测试。这是我最终选择的,因为我在从中提取样本的代码上启用了RedisRepositories
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
@EntityScan
static class Config
尝试将@extendedwith(SpringExtension.class)添加到类DemoApplicationTestsDidn上面。我不适用。但在尝试了一些事情后发现了。尝试在类DemoApplicationTestsDidn上面添加@ExtendWith(SpringExtension.class)对我不起作用。但在尝试了一些东西后发现了。