Перенесите один класс @Configuration на каждый spring boot @Test

В моем загрузочном приложении spring я хочу переопределить только один из моих классов @Configuration с тестовой конфигурацией (в частности, мой класс @EnableAuthorizationServer @Configuration) во всех моих тестах.

До сих пор после обзора spring функций тестирования загрузки и spring функции тестирования интеграции прямое решение не появилось:

  • @TestConfiguration: для расширения, а не для переопределения;
  • @ContextConfiguration(classes=…​) и @SpringApplicationConfiguration(classes =…​) позволяет мне переопределить всю конфигурацию, а не только один класс;
  • Внутренний класс @Configuration внутри a @Test предлагается переопределить конфигурацию по умолчанию, но пример не указан;

Любые предложения?

Ответ 1

Внутренняя тестовая конфигурация

Пример внутренней @Configuration для вашего теста:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeTest {

    @Configuration
    static class ContextConfiguration {
        @Bean
        @Primary //may omit this if this is the only SomeBean defined/visible
        public SomeBean someBean () {
            return new SomeBean();
        }
    }

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}

Аннотации уровня класса @RunWith(SpringRunner.class) и @SpringBootTest относятся к Spring Boot 1.4+, но пример внутренней @Configuration остается действительным даже для более старых версий с использованием @RunWith(SpringJUnit4ClassRunner.class) и @SpringApplicationConfiguration или @ContextConfiguration.

@Primary

Аннотация @Primary в определении bean заключается в том, чтобы гарантировать, что у этого будет приоритет, если найдено более одного.

Конфигурация повторного использования

Если вы хотите повторно использовать тестовую конфигурацию для нескольких тестов, вы можете определить автономный класс конфигурации с Spring Profile @Profile("test"). Затем попросите свой тестовый класс активировать профиль с помощью @ActiveProfiles("test"). См. Полный код:

@RunWith(SpringRunner.class)
@SpringBootTests
@ActiveProfiles("test")
public class SomeTest {

    @Autowired
    private SomeBean someBean;

    @Test
    public void testMethod() {
        // test
    }
}

@Configuration
@Profile("test")
public class TestConfiguration {
    @Bean
    @Primary //may omit this if this is the only SomeBean defined/visible
    public SomeBean someBean() {
        return new SomeBean();
    }
}

Ответ 2

Вы должны использовать spring профили загрузки:

  • Аннотировать вашу тестовую конфигурацию с помощью @Profile("test").
  • Аннотировать конфигурацию вашего производства с помощью @Profile("production").
  • Задайте профиль производства в файле свойств: spring.profiles.active=production.
  • Задайте тестовый профиль в тестовом классе с помощью @Profile("test").

Итак, когда ваше приложение запустится, он будет использовать класс "production", а при тестировании он будет использовать класс "test".

Если вы используете внутренний/вложенный класс @Configuration, он будет использоваться вместо основной конфигурации ваших приложений.