如何在Spring Boot 1.4.0中为@DataJpaTest排除/禁用特定的自动配置?

时间:2016-08-31 15:05:55

标签: spring unit-testing spring-data-jpa

我使用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;
}

8 个答案:

答案 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