Добавление класса конфигурации в 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.