Как я могу протестировать только один компонент, используя существующий класс конфигурации spring приложения?

В моем коде я не хочу загружать все компоненты, определенные в классе XXApplicationConfig.

XXApplicationConfig — это аннотированный файл @Configuration, в котором определена группа компонентов Spring.

Итак, я хочу загружать только AppBean из класса XXApplicationConfig во время тестирования, чтобы сократить время загрузки теста, а также различать то, что я тестирую. Я также хочу загрузить класс, используя класс XXApplicationConfig, чтобы убедиться, что определенная конфигурация bean-компонента также верна.

Это мой тестовый класс (модифицированный) для тестирования класса AppBean.

Не могли бы вы сообщить мне, является ли это правильным подходом, и предложить, как сделать его лучше? В настоящее время этот подход, кажется, работает. Но не уверен, что это правильный способ приблизиться к нему.

@ContextConfiguration(loader=AnnotationConfigContextLoader.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class ApplicationTest {

    @Configuration
    @PropertySources(value = {@PropertySource("classpath:test.properties")})
    static class MyTestConfiguration {

        @Bean
        public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceHolderConfigurer()  {
            return new PropertySourcesPlaceholderConfigurer();
        }

        @Bean
        public XXApplicationConfig xxAppConfig() {
            return new XXApplicationConfig();
        }

        @Bean
        public CustomTestService customTestService() {
            return new CustomTestService();
        }

        @Bean
        public AppBean appBean() throws Exception {
            return XXApplicationConfig().appBean();
        }

    }

    @Autowired
    private AppBean appBean;


    @Test
    public void testAppBean() {
        test appBean.doSomething();
    }
}

person would_like_to_be_anon    schedule 02.09.2014    source источник


Ответы (2)


Если вы хотите протестировать только один объект, просто создайте один объект этого класса, используя конструктор этого класса. Спринг-бины предназначены для POJO. Контекст Spring — это просто удобный способ создания и соединения объектов. Ничто не мешает вам создавать и подключать их самостоятельно.

person Raedwald    schedule 02.09.2014

Если вы можете создать экземпляр класса, который хотите протестировать, и вручную внедрить все необходимые зависимости через конструктор и/или сеттер-геттеры, вам не нужно использовать Spring в своем тесте.

Однако, если ваш компонент:

  1. использует приватные поля, аннотированные @Autowired или @Value, без соответствующих геттеров/сеттеров.
  2. зависит от многих других бобов.
  3. поведение, которое вы хотите протестировать, зависит от Spring AOP/Proxies (например, вы используете @Transactional или @Cacheable).

Затем вам понадобится Spring для подключения bean-компонента. Я лично предпочитаю определять минимальный класс @Configuration для таких случаев.

Опять же, если ваш bean-компонент соответствует условиям в списке, вам следует подумать о рефакторинге bean-компонента, чтобы свести к минимуму его зависимости и облегчить тестирование.

person Ricardo Veguilla    schedule 02.09.2014