Как исключить / отключить определенную автоконфигурацию в Spring boot 1.4.0 для @DataJpaTest?

Я использую @DataJpaTest из Spring для моего теста, который затем будет использовать H2, как в базе данных памяти, как описано здесь. Я также использую Flyway для производства. Однако, как только тест начинается, FLyway запускает и читает файл SQL. Как я могу исключить FlywayAutoConfiguration и сохранить все остальное, как описано здесь в весенней документации, чтобы позволить Hibernate создавать таблицы в H2 для меня?

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

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private MyRepository triggerRepository;
}

7 ответов

Вы пробовали @OverrideAutoConfiguration аннотаций? Он говорит, что "может быть использован для переопределения @EnableAutoConfiguration Я предполагаю, что оттуда вы можете как-то исключить FlywayAutoConfiguration вот так:

@EnableAutoConfiguration(exclude=FlywayAutoConfiguration.class)

Добавление зависимости от базы данных в памяти в мой build.gradle
например testRuntime "com.h2database:h2:1.4.194"

И добавление flyway.enabled=false до приложения. свойства у меня в src/test/resources работали.

Я конвертирую старое приложение JDBC в приложение spring-data-jpa и сейчас работаю над первыми тестами. Я продолжал видеть ошибку инстанцирования модуля безопасности из весенней загрузки, когда он пытался загрузить настройки безопасности, даже если @DataJpaTest должно теоретически исключать это.

Моя проблема с модулем безопасности, вероятно, связана с уже существующей реализацией, которую я унаследовал с помощью PropertySourcesPlaceholderConfigurer (через мой PropertySpringConfig импорт ниже)

После документов здесь:

http://docs.spring.io/spring-boot/docs/1.4.x/reference/htmlsingle/

и ваши комментарии к ответу @LiviaMorunianu, мне удалось обойти каждый случай весенней загрузки и запустить JUnit с автоматически настроенной встроенной БД.

Мой основной / производственный класс начальной загрузки с начальной загрузкой запускает все, включая то, что я хочу исключить из моих тестов. Так что вместо использования @DataJpaTestЯ скопировал большую часть того, что он делает, используя @Import ввести централизованные конфигурации, которые будут использовать все тестовые / живые установки.

У меня также были проблемы из-за структуры пакета, который я использую, так как изначально я выполнял тест, основанный на com.mycompany.repositories и он не нашел сущностей в com.mycompany.entities,

Ниже приведены соответствующие классы.

JUnit Test

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

В моем конкретном случае мне нужно было отключить FlywayDB на тестах интеграции в памяти. Они используют набор весенних аннотаций для автоматической настройки ограниченного applicationContext.

@ImportAutoConfiguration (значение = TestConfig.class, exclude = FlywayAutoConfiguration.class)

исключение может эффективно ограничить набор bean-компонентов, инициированных для этого теста

У меня была та же проблема с моими тестами DbUnit, определенными в тестовых классах Спока. В моем случае я смог отключить миграцию Flyway и инициализировать таблицы базы данных тестирования H2 следующим образом:

@SpringBootTest(classes = MyApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE,
    properties = ["flyway.enabled=false", "spring.datasource.schema=db/migration/h2/V1__init.sql"])

Я добавил эту аннотацию к своему классу спецификации теста Спока. Кроме того, я смог заставить его работать, только добавив аннотацию конфигурации контекста:

@ContextConfiguration(classes = MyApplication.class)

Вы также можете подать в суд на следующую аннотацию:

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

Я решил ту же проблему, исключив автоконфигурацию из определения приложения, т.е.

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

Вы можете просто отключить его в своем тестовом файле yaml:

flyway.enabled: false

Другие вопросы по тегам