【问题标题】:Junit Test in Spring Boot does not inject the serviceSpring Boot 中的 Junit 测试不注入服务
【发布时间】:2017-10-30 05:09:07
【问题描述】:

我有一个基本的 SpringBoot 应用程序。使用 Spring Initializer、嵌入式 Tomcat、Thymeleaf 模板引擎,并打包为可执行 JAR 文件。

我有这项服务:

@Service
public class TdkRestApiService {
    ...
}

我想测试的:

@ContextConfiguration(classes={TdkApplicationConfig.class, TdkDevelopmentConfig.class}) 
@RunWith(SpringRunner.class)
public class TdkRestApiServiceTests {


    /**
     * The object being tested.
     */
    @Autowired
    TdkRestApiService tdkRestApiService;

    @Test
    public void getCallbacksByDeviceTypeTest () throws IOException {

        tdkRestApiService.getCallbacksByDeviceType("2", "3");

    }
}

但我得到了一个错误:

ERROR o.s.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@dd3b207] to prepare test instance [com.tdk.backend.service.TdkRestApiServiceTests@6db9f5a4]
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.tdk.backend.service.TdkRestApiServiceTests': Unsatisfied dependency expressed through field 'tdkRestApiService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.tdk.backend.service.TdkRestApiService' 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.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:386)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)

【问题讨论】:

    标签: java spring spring-mvc spring-boot junit


    【解决方案1】:

    这里:

    @ContextConfiguration
    @RunWith(SpringRunner.class)
    public class TdkRestApiServiceTests {
    

    您没有指定ContextConfiguration 注释的classes 属性。

    您应该使用设置所有配置的根 Spring 配置类设置此属性,尤其是 TdkRestApiService bean。
    例如,如果您的根 Spring 配置类是 MyConfig,您可以指定它:

    @ContextConfiguration(classes = MyConfig.class)
    @RunWith(SpringRunner.class)
    public class TdkRestApiServiceTests {
    

    您可以通过Spring documentation discussing of detecting test configuration获得更多信息。

    摘录下方:

    如果您熟悉 Spring 测试框架,您可能习惯于 使用 @ContextConfiguration(classes=...​) 来指定哪个 Spring @Configuration 加载。或者,您可能经常 在您的测试中使用了嵌套的 @Configuration 类。

    【讨论】:

    • 你救了我很多头痛
    【解决方案2】:

    这解决了我的问题:

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes =  TdkApplication.class)
    public class SigfoxRestApiServiceTests {
    .
    }
    

    【讨论】:

      【解决方案3】:

      尝试将@SpringBootTest 添加到测试类:

      @SpringBootTest
      @RunWith(SpringRunner.class)
      public class TdkRestApiServiceTests {
         ...
      }
      

      【讨论】:

        【解决方案4】:

        通过创建如下所示的 TestConfig.class 有一个巧妙的解决方案:

        @Configuration
        @EnableAutoConfiguration
        @ComponentScan
        public class TestConfig {
        
        }
        

        然后,您可以使用 @Autowired 组件将其添加到您的测试类中,如下所示:

        @RunWith(SpringRunner.class)
        @SpringBootTest(classes = TestConfig.class)
        public class Test { 
        
           @Autowired
           private Component component;
        
        }
        

        之后,您将能够在测试类中使用 Spring 组件。

        【讨论】:

        • 不知何故似乎还不够,没有找到我的豆子...直到我添加了更多类似@Import({ MyClass1.class, MyConfigurationClass2.class }
        • 我认为这取决于您的课程所在的位置,在我的情况下,所有课程都在同一个基础包中。
        猜你喜欢
        • 2022-10-24
        • 2021-05-04
        • 2023-01-15
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 2021-03-15
        • 1970-01-01
        • 2021-05-20
        相关资源
        最近更新 更多