【问题标题】:Adding configuration class to SpringBootTest breaks component scan向 SpringBootTest 添加配置类会中断组件扫描
【发布时间】:2018-09-11 18:53:44
【问题描述】:

我正在尝试禁用真正的 Mongo 连接并在测试中将其替换为 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();
        }
    }

然后应用程序找不到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

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

【问题讨论】:

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


【解决方案1】:

保留@SpringBootTest,然后使用@TestConfiguration 和bean 创建一个类,如下所示:

@TestConfiguration
public class TransactionManagerTestConfiguration {

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

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

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

【讨论】:

    【解决方案2】:

    尝试使用

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

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

    【讨论】:

    • 如果你这样做 java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or SpringBootTest(classes=...) 你会得到这个错误,你在org.springframework的测试。 util.Assert.state(Assert.java:73) 在
    猜你喜欢
    • 2015-01-13
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多