Добавление класса конфигурации в SpringBootTest прерывает сканирование компонентов

Я пытаюсь отключить настоящее соединение Монго и заменить его на макет Fongo в тестах.

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

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

    @Autowired
    private WebApplicationContext wac;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    private MyService service;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

    @Test
    public void performTest() throws Exception {
        ... logic ...
    }
}

Это работает нормально, если я не пытаюсь добавить свой файл конфигурации, изменяя эту строку:

@SpringBootTest

к этому:

@SpringBootTest(classes = TestConfig.class)

Сам класс конфигурации:

@Configuration
@ComponentScan
@EnableMongoRepositories
public class TestConfig extends AbstractMongoConfiguration {

    @Override
    protected String getDatabaseName() {
        return "FongoDB";
    }

    @Override
    public Mongo mongo() {
        return new Fongo(getDatabaseName()).getMongo();
    }
}

Затем приложение не может найти бины и выдает следующее исключение:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.fasterxml.jackson.databind.ObjectMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
    ... 28 more

Как я могу это исправить и правильно применить дополнительную конфигурацию?

0 ответов

Попробуйте использовать

  • @SpringBootTest @Import(value = TestConfig.class)

вместо @SpringBootTest(classes = TestConfig.class)

Сохраните @SpringBootTest, а затем создайте класс с помощью @TestConfiguration с компонентами следующим образом:

@TestConfiguration
public class TransactionManagerTestConfiguration {

   @Bean
   public String getDatabaseName() {
       return "FongoDB";
   }

   @Bean
   public Mongo mongo() {
       return new Fongo(getDatabaseName()).getMongo();
   }
}

Согласно javadoc: Конфигурация, которая может использоваться, чтобы определить дополнительные компоненты или настройки для теста. В отличие от обычных классов конфигурации использование TestConfiguration не предотвращает автоматическое обнаружение SpringBootConfiguration.

Другие вопросы по тегам