Подтвердить что ты не робот

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

Ответ 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