向SpringBootTest添加配置类会中断组件扫描

时间:2018-04-02 14:35:33

标签: spring-boot autowired spring-boot-test component-scan fongo

我正在尝试禁用真正的Mongo连接,并在测试中用Fongo mock替换它。

这是我的测试类:

@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();
    }
}

然后应用程序无法找到bean并抛出下一个异常:

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

如何修复它并正确应用其他配置?

2 个答案:

答案 0 :(得分:0)

尝试使用

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

而不是  @SpringBootTest(classes = TestConfig.class)

答案 1 :(得分:0)

保留@SpringBootTest,然后使用@TestConfiguration和以下类中的bean创建一个类:

<div className="panel-body">

根据javadoc:可用于定义测试的其他bean或自定义的配置。与常规Configuration类不同,使用TestConfiguration 不会阻止自动检测SpringBootConfiguration