我使用Spring的@DataJpaTest进行测试,然后在内存数据库中使用H2 这里描述 。我也在使用Flyway进行制作。但是,一旦测试开始,FLyway就会启动并读取SQL文件。如何排除FlywayAutoConfiguration并按照描述保留其余部分 这里是春季文档 为了让Hibernate为我创建H2中的表格?
@RunWith(SpringRunner.class)
@DataJpaTest
public class MyRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private MyRepository triggerRepository;
}
你试过吗? @OverrideAutoConfiguration
注解?
它说它“可以用来覆盖 @EnableAutoConfiguration
”。
我假设从那里你可以以某种方式排除 FlywayAutoConfiguration
像这样:
@EnableAutoConfiguration(exclude=FlywayAutoConfiguration.class)
将对内存数据库的依赖性添加到build.gradle中
例如 testRuntime "com.h2database:h2:1.4.194"
并添加 flyway.enabled=false
到src / test / resources中的application.properties为我工作。
我正在将旧的JDBC应用程序转换为spring-data-jpa应用程序,现在我正在进行第一次测试。我一直在看到Spring-boot中的安全模块实例化错误,因为它尝试引导安全设置,即使如此 @DataJpaTest
理论上应该排除它。
我对安全模块的问题可能源于我继承使用的预先存在的实现 PropertySourcesPlaceholderConfigurer
(通过我的 PropertySpringConfig
导入如下)
按照这里的文档:
http://docs.spring.io/spring-boot/docs/1.4.x/reference/htmlsingle/#test-auto-configuration
以及你对@LiviaMorunianu的回答的评论,我设法超越每个spring-boot异常并让JUnit运行自动配置的嵌入式数据库。
我的主要/生产spring-boot bootstrap类引导一切,包括我想从测试中排除的东西。所以不要使用 @DataJpaTest
,我用它复制了很多东西 @Import
引入每个测试/现场设置将使用的集中配置。
由于我使用的包结构,我也遇到了问题,因为最初我正在运行基于的测试 com.mycompany.repositories
它没有找到实体 com.mycompany.entities
。
以下是相关课程。
JUnit测试
@RunWith(SpringRunner.class)
@Transactional
@Import({TestConfiguration.class, LiveConfiguration.class})
public class ForecastRepositoryTests {
@Autowired
ForecastRepository repository;
Forecast forecast;
@Before
public void setUp() {
forecast = createDummyForecast(TEST_NAME, 12345L);
}
@Test
public void testFindSavedForecastById() {
forecast = repository.save(forecast);
assertThat(repository.findOne(forecast.getId()), is(forecast));
}
实时配置
@Configuration
@EnableJpaRepositories(basePackages = {"com.mycompany.repository"})
@EntityScan(basePackages = {"com.mycompany.entity"})
@Import({PropertySpringConfig.class})
public class LiveConfiguration {}
测试配置
@OverrideAutoConfiguration(enabled = false)
@ImportAutoConfiguration(value = {
CacheAutoConfiguration.class,
JpaRepositoriesAutoConfiguration.class,
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
TransactionAutoConfiguration.class,
TestDatabaseAutoConfiguration.class,
TestEntityManagerAutoConfiguration.class })
public class TestConfiguration {
// lots of bean definitions...
}
PropertySpringConfig
@Configuration
public class PropertySpringConfig {
@Bean
static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer()
throws IOException {
return new CorePropertySourcesPlaceholderConfigurer(
System.getProperties());
}
}
我在Spock测试类中定义的DbUnit测试遇到了同样的问题。在我的情况下,我能够禁用Flyway迁移并设法初始化H2测试数据库表,如下所示:
@SpringBootTest(classes = MyApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE,
properties = ["flyway.enabled=false", "spring.datasource.schema=db/migration/h2/V1__init.sql"])
我将这个注释添加到我的Spock测试规范类中。此外,如果我还添加了上下文配置注释,我只能使其工作:
@ContextConfiguration(classes = MyApplication.class)
我通过从应用程序定义中排除自动配置来解决同样的问题,即
@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
在我的特定情况下,我需要在内存中集成测试中禁用FlywayDB。它们使用一组spring注释来自动配置有限的applicationContext。
@ImportAutoConfiguration(value = TestConfig.class, exclude = FlywayAutoConfiguration.class)
排除可以有效地进一步限制为此测试启动的bean集
你也可以起诉以下注释:
@RunWith(SpringRunner.class)
@DataJpaTest(excludeAutoConfiguration = {MySqlConfiguration.class, ...})
public class TheClassYouAreUnitTesting {
}