我使用Spring的@DataJpaTest进行测试,然后在内存数据库中使用H2作为described here。我也使用Flyway进行制作。但是一旦测试开始,FLyway就会启动并读取SQL文件。我如何排除FlywayAutoConfiguration并按照here in spring documentation所述保留其余部分,以便Hibernate为我创建H2中的表?
@RunWith(SpringRunner.class)
@DataJpaTest
public class MyRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private MyRepository triggerRepository;
}
答案 0 :(得分:5)
您是否尝试过@OverrideAutoConfiguration
注释?
它说它“可以用来覆盖@EnableAutoConfiguration
”。
我假设从那里你可以以某种方式排除FlywayAutoConfiguration
像这样:
@EnableAutoConfiguration(exclude=FlywayAutoConfiguration.class)
答案 1 :(得分:4)
将内存数据库的依赖项添加到build.gradle中
例如testRuntime "com.h2database:h2:1.4.194"
将flyway.enabled=false
添加到src / test / resources中的application.properties为我工作。
答案 2 :(得分:2)
我正在将旧的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());
}
}
答案 3 :(得分:1)
我在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)
答案 4 :(得分:1)
我通过从应用程序定义中排除自动配置来解决同样的问题,即
@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
答案 5 :(得分:1)
在我的特定情况下,我需要在内存集成测试中禁用FlywayDB。这些正在使用一组spring注释来自动配置有限的applicationContext。
@ImportAutoConfiguration(值= TestConfig.class,排除= FlywayAutoConfiguration.class )
exclude可以有效地进一步限制为此测试启动的bean的数量
答案 6 :(得分:0)
您还可以起诉以下注释:
@RunWith(SpringRunner.class)
@DataJpaTest(excludeAutoConfiguration = {MySqlConfiguration.class, ...})
public class TheClassYouAreUnitTesting {
}
答案 7 :(得分:0)
您可以在测试yaml文件中将其禁用:
flyway.enabled: false