【问题标题】:spring retry unit test春季重试单元测试
【发布时间】:2016-08-11 10:40:33
【问题描述】:

我在一个 maven 项目中使用 spring retry (http://docs.spring.io/spring-retry/docs/1.1.2.RELEASE/apidocs/),并且我有以下单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class RetriableFileManagerTest {

    @Autowired
    @Qualifier("asset")
    private AssetResource assetResource;

    @Test
    public void testRetry() throws URISyntaxException {
        byte[] image = this.assetResource.fetchResource("name", "path");
        verify(assetResource, times(3)).fetchResource("name", "path");
        Assert.assertEquals("should be equal", "image", new String(image));
    }

    @Configuration
    @EnableRetry
    public static class SpringConfig {
        @Bean(name = "asset")
        public AssetResource assetResource() throws Exception {
            AssetResource remoteService = mock(AssetResource.class);
            when(remoteService.fetchResource(anyString(), anyString()))
                    .thenThrow(new RuntimeException("Remote Exception 1"))
                    .thenThrow(new RuntimeException("Remote Exception 2"))
                    .thenReturn("Completed".getBytes());
            return remoteService;
        }
    }
}

但是当我尝试运行测试时它失败了

    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private ctp.cms.actions.handlers.repository.resources.AssetResource ctp.cms.actions.handlers.filemanager.RetriableFileManagerTest.assetResource; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [ctp.cms.actions.handlers.repository.resources.AssetResource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=asset)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
    ... 25 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [ctp.cms.actions.handlers.repository.resources.AssetResource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=asset)}

【问题讨论】:

    标签: spring junit4


    【解决方案1】:

    终于解决了问题,我不得不将@Retryable注解移到AssetResource实现的接口上,并将这个接口类型自动装配到单元测试中。

    【讨论】:

    • AssetResource 是最后一课吗?
    【解决方案2】:

    错误信息说

    没有符合条件的 bean 类型 [ctp.cms.actions.handlers.repository.resources.AssetResource] 找到 对于依赖

    ctp.cms.actions.handlers.repository.resources.AssetResource 是如何声明的?

    你有@Component(@Service或类似的注释吗?)这个包是否为@ComponentScan启用?

    【讨论】:

    • AssetResource bean 在 junit 测试未加载的应用程序 spring 上下文 xml 中声明。类本身没有@Component 或类似的注解。
    • 您必须加载声明 AssetResource 类的上下文。无需为整个应用程序加载 xml 文件,您可以仅使用 AssetResource 类(以及 AssetResource 的依赖项)拥有测试上下文
    • 这样做了,现在从 xml spring 配置加载了assetResource bean。但是,它的方法没有被模拟并包含在 @EnableRetry 注释中。我正在关注github.com/bijukunjummen/test-spring-retry/blob/master/src/test/… 中的示例
    • 在测试加载的任何上下文中是否有@EnableRetry?
    • 是的,在单元测试(SpringConfig)的内部静态类中。我期待 AssetResource 是从这个特定的上下文(内部静态类)注入的,除非我遗漏了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2012-10-19
    • 2011-09-26
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多