Исключая конфигурацию в весеннем загрузочном тесте - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующие настройки в проекте Maven.Класс конфигурации для производительного кода:

package com.example;
@Configuration
public class MyConfiguration {
    @Bean
    public A beanA() {
      return new A();
    }
    ...
}

Затем у меня есть один тест, который имеет внутренний Configuration:

package com.example;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class, SpringConfigurationTest.MyTestConfiguration.class})
public class SpringConfigurationTest {
    @TestConfiguration
    static class MyTestConfiguration {
        @Bean
        @Primary
        public A beanA() {
          return mock(A.class);
        }    
    }
}

Тесты в этом классе работают нормально.Тогда у меня есть еще один класс Test в подпакете:

package com.example.sub;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class, AnotherSpringConfigurationTest.MyTestConfiguration.class})
public class AnotherSpringConfigurationTest {
    @TestConfiguration
    static class MyTestConfiguration {
        @Bean
        public B beanB() {
          return new B()
        }    
    }
}

При запуске тестов в этом классе также включена конфигурация теста из SpringConfigurationTest.MyTestConfiguration.Я предполагаю, что причиной этого является включение MyConfiguration, который находится в корневом каталоге.В результате в AnotherSpringConfigurationTest боб A подвергается насмешке вместо реального экземпляра.

Как можно избежать того, чтобы классы конфигурации внутри других тестов «просачивались» в другие тесты?

Я видел Профиль Spring-boot по умолчанию для интеграционных тестов , который использует профили Spring в Spring Boot 1.4.1, а я использую Spring Boot 2.0.1.Хотя я уверен, что это можно сделать.

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

Существует ли простое и элегантное решение с Spring Boot 2, чтобы избежать конфликтных конфигураций контекста?

1 Ответ

0 голосов
/ 23 мая 2018

Во-первых, мне не нравится идея поместить класс конфигурации в другой класс.Я не знаю, часто ли это делается, я вроде как новичок в Spring.Но вот что я бы сделал:

Первый файл конфигурации:

@Configuration
@Import(MyConfiguration.class)
public class MyTestConfiguration {
    @Bean
    @Primary // added to let know on @Autowired to use this one instead of the one in first MyConfiguration.class
    public A beanA() {
      return mock(A.class);
    }    
}

Второй файл конфигурации:

@Configuration
@Import(MyConfiguration.class)
public class MyOtherTestConfiguration {
    @Bean
    public B beanB() {
      return new B()
    }    
}

Я не знаком с @TestConfiguration.Вот почему я использую @Configuration.

Первый тестовый класс:

package com.example;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyTestConfiguration.class)
public class SpringConfigurationTest {

}

Второй тестовый класс:

package com.example.sub;
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = MyOtherTestConfiguration.class)
public class AnotherSpringConfigurationTest {

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...