Spring @DataJpaTest with @TestContainers in JUnit 5



这是Spring@DataJpaTest与JUnit 5的扩展,主要区别在于添加了测试容器。

我试图在git回购样本中保持最低限度。

测试是非常直接的

@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;
}
}
}

我将主要应用程序保持在最低限度

@SpringBootApplication
@EnableTransactionManagement
@EnableJpaRepositories
@EntityScan
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

但运行测试时,我得到了以下堆栈跟踪段:


Caused by: java.lang.IllegalStateException: Unable to retrieve @EnableAutoConfiguration base packages
at org.springframework.boot.autoconfigure.AutoConfigurationPackages.get(AutoConfigurationPackages.java:78)
at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport.getBasePackages(AbstractRepositoryConfigurationSourceSupport.java:79)
at org.springframework.boot.autoconfigure.data.AbstractRepositoryConfigurationSourceSupport$AutoConfiguredAnnotationRepositoryConfigurationSource.getBasePackages(AbstractRepositoryConfigurationSourceSupport.java:138)
at org.springframework.data.repository.config.RepositoryConfigurationSourceSupport.lambda$getCandidates$2(RepositoryConfigurationSourceSupport.java:82)

我找到了两种方法来实现这一点。一种方法是

@ContextConfiguration(classes = {
DemoApplication.class,
DemoApplicationTests.Config.class
})

它从DemoApplication加载配置。尽管它通常更干净,但如果您有其他服务,如EnableRedistores和EnableKafka,测试可能仍然会失败,因为这些资源可能没有在脚本中配置。

或者,可以启用Config类,以便只执行JPA测试。这是我最终选择的,因为我在从中提取样本的代码上有EnableRedistores。

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
@EntityScan
static class Config

最新更新