Как исключить/отключить определенную автоконфигурацию в Spring boot 1.4.0 для @DataJpaTest?
Я использую @DataJpaTest из Spring для моего теста, который затем будет использовать H2 как в базе данных памяти, как описанный здесь. Я также использую Flyway для производства. Однако после запуска теста FLyway запускает и считывает файл SQL. Как я могу исключить функцию FlywayAutoConfiguration и сохранить остальные, как описано здесь, в документации Spring, чтобы позволить Hibernate создавать таблицы в H2 для меня?
@RunWith(SpringRunner.class)
@DataJpaTest
public class MyRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private MyRepository triggerRepository;
}
Ответы
Ответ 1
Вы пробовали аннотацию @OverrideAutoConfiguration
?
В нем говорится, что "можно использовать для переопределения @EnableAutoConfiguration
".
Я предполагаю, что оттуда вы можете как-то исключить FlywayAutoConfiguration
так:
@EnableAutoConfiguration(exclude=FlywayAutoConfiguration.class)
Ответ 2
Добавление зависимости от базы данных в памяти для моего build.gradle
например testRuntime "com.h2database:h2:1.4.194"
И добавление flyway.enabled=false
в application.properties в src/test/resources работало для меня.
Ответ 3
Я конвертирую старое приложение 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 для запуска с встроенной БД с автоматической настройкой.
My main/production 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));
}
Конфигурация Live
@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());
}
}
Ответ 4
У меня была та же проблема с моими тестами DbUnit, определенными в тестовых классах Spock. В моем случае мне удалось отключить миграцию 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)
Ответ 5
Я разрешил ту же проблему, исключив автоконфигурацию из определения моего приложения, то есть
@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Ответ 6
В моем конкретном случае мне нужно было отключить FlywayDB на интеграционных тестах в памяти. Они используют набор весенних аннотаций для автоматической настройки ограниченного applicationContext.
@ImportAutoConfiguration (value = TestConfig.class, exclude = FlywayAutoConfiguration.class)
исключение может эффективно ограничить набор bean-компонентов, инициированных для этого теста
Ответ 7
Вы также можете подать в суд на следующую аннотацию:
@RunWith(SpringRunner.class)
@DataJpaTest(excludeAutoConfiguration = {MySqlConfiguration.class, ...})
public class TheClassYouAreUnitTesting {
}
Ответ 8
Вы можете просто отключить его в своем тестовом файле yaml:
flyway.enabled: false