2016-08-16 2 views
0

У меня проблема с перестановкой бобы в интеграционных тестах весной (со Spock).Весна: перевернутые бобы в интеграционных тестах с изоляцией

Скажет, это мое приложение конфигурация:

@EnableWebMvc 
@SpringBootApplication 
@Configuration 
class Main { 
    @Bean 
    Race race(Car car) { 
     // ... 
    } 

    @Bean 
    Car car() { 
     // ... 
    } 
} 

И у меня есть 2 отдельных интеграционные тесты, которые я хочу, чтобы отделить Car реализации, предоставляемой.

@Slf4j 
@SpringApplicationConfiguration 
class OneIntegrationSpec extends AbstractIntegrationSpec { 

    @Configuration 
    @Import(Main.class) 
    static class Config { 
     @Bean 
     Car oneTestCar() { 
      return new FerrariCar(); 
     } 
    } 
} 


@Slf4j 
@SpringApplicationConfiguration 
class OtherIntegrationSpec extends AbstractIntegrationSpec { 

    @Configuration 
    @Import(Main.class) 
    static class Config { 
     @Bean 
     Car otherTestCar() { 
      return new TeslaCar(); 
     } 
    } 
} 

Когда я бегу один из них я получаю: NoUniqueBeanDefinitionException причина Spring обнаруживает есть множество реализаций автомобиля. Как сделать тестовый внутренний класс Config с аннотацией @Configuration только для этого конкретного теста? Я видел подход с @Profile, но это означало бы создание отдельных имен профилей для каждого IntegrationSpec, который немного нарушает DRY. Есть ли другой подход, чем @ActiveProfiles?

+0

Быстрое и грязное решение может состоять в том, чтобы просто объявить ваши тестовые бобы @Primary, что обойдется в том, что существует более одного подходящего компонента, так как тогда будет использоваться первичный кандидат. –

+0

Да, но тогда, когда я получил '@ Primary' в' 'IntegrationSpec', возникает одна и та же проблема. – dmydlarz

+0

Почему вы загружаете оба' IntegrationSpec' одновременно? У вас нет самого теста (и как вы загружаете контекст Spring), но, возможно, не используете сканирование компонентов для этих классов. –

ответ

0

Мне сложно понять ваш прецедент. Вам нужно инициализировать весь applicationContext для проверки FerrariCar и TeslaCar? Разве вы не можете проверить их изолированно?

Если интеграционный тест является единственным способом, вы можете попробовать excludeFilters в @ComponentScan отключить автоматическое определение вашей тестовой конфигурации, как показано в https://stackoverflow.com/a/30199808/1553203. Затем вы можете добавить конкретный тест @Configuration для каждого Spec/Test, используя @ Import/@ ComponentScan.

Смежные вопросы