Как исключить / отключить определенную автоконфигурацию в 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