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


我使用Spring的@DataJpaTest进行测试,然后在内存数据库中使用H2 这里描述 。我也在使用Flyway进行制作。但是,一旦测试开始,FLyway就会启动并读取SQL文件。如何排除FlywayAutoConfiguration并按照描述保留其余部分 这里是春季文档 为了让Hibernate为我创建H2中的表格?

@RunWith(SpringRunner.class)
@DataJpaTest
public class MyRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private MyRepository triggerRepository;
}

10855
2017-08-31 15:05


起源

@ virgium03有帮助吗?我正在解决类似的问题。 - Adam


答案:


你试过吗? @OverrideAutoConfiguration 注解? 它说它“可以用来覆盖 @EnableAutoConfiguration”。 我假设从那里你可以以某种方式排除 FlywayAutoConfiguration  像这样:

@EnableAutoConfiguration(exclude=FlywayAutoConfiguration.class)

4
2017-08-31 15:13



注释表明它可以与@ ImportAutoConfiguration结合使用。使用@ EnableAutoConfiguration排除不起作用。我试图添加除Flyway之外的每个自动配置类,只是为了看它是否有效。有些部分正在工作(例如Flyway不再开始)有些部分没有。例如,交易无效,我必须使用@Transactional。此表也不是由Hibernate自动创建的。有缺少的部分,实际上我更喜欢排除运行。我现在正在使用以下配置。 - LAC
@RunWith(SpringRunner.class)@SpringBootTest @ OverrideAutoConfiguration(enabled = false)@ ImportAutoConfiguration(value = {CacheAutoConfiguration.class,JpaRepositoriesAutoConfiguration.class,DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,HibernateJpaAutoConfiguration.class,TransactionAutoConfiguration.class,TestDatabaseAutoConfiguration.class, TestEntityManagerAutoConfiguration.class})@ Transactional - LAC
我提出了 github.com/spring-projects/spring-boot/issues/6809 看看我们可以做些什么来改善这里的事情。 - Phil Webb
@PhilWebb很棒;)但你现在有一个解决方法吗? - LAC
我还不害怕。 - Phil Webb


将对内存数据库的依赖性添加到build.gradle中
例如 testRuntime "com.h2database:h2:1.4.194"

并添加 flyway.enabled=false 到src / test / resources中的application.properties为我工作。


3
2018-04-02 19:00





我正在将旧的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());
    }
}

2
2017-11-09 17:06



我玩得很开心 @DataJpaTest working(spring 5.04)并仅测试我的简单存储库。然后我向SchemaRegistryClient添加了一个依赖项,我完全无关的JPA测试停止了工作。它突然抱怨缺少一个CacheManager bean ...我最终堆叠了一堆类似的注释和配置类以使其恢复工作: - /希望@DataJpaTest注释将得到改进 - Ghurdyl


我在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)

1
2017-09-15 14:56





我通过从应用程序定义中排除自动配置来解决同样的问题,即

@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

1
2017-11-07 09:42





在我的特定情况下,我需要在内存中集成测试中禁用FlywayDB。它们使用一组spring注释来自动配置有限的applicationContext。

@ImportAutoConfiguration(value = TestConfig.class, exclude = FlywayAutoConfiguration.class

排除可以有效地进一步限制为此测试启动的bean集


1
2017-07-17 15:25



由于这个问题,注释已完全改变。在编写本文时,不存在排除选项,因此此问题是在Spring引导端创建的: github.com/spring-projects/spring-boot/issues/6809 - LAC
我很高兴听到这个。我只是想帮助关注者,这个问题尚未被接受。 - padisah


你也可以起诉以下注释:

@RunWith(SpringRunner.class)
@DataJpaTest(excludeAutoConfiguration = {MySqlConfiguration.class, ...})
public class TheClassYouAreUnitTesting {
}

0
2017-09-30 00:15