繁体   English   中英

单元测试-测试@Retryable和@Recover的问题

[英]Unit test - Problems testing @Retryable and @Recover

我有一个使用@Retryable批注的组件,另一个使用该组件的服务。 因此,我试图测试使用@Retryable批注的组件是否正在重试。

我已经尝试了网络上目前存在的所有解决方案,但对我没有任何帮助。 我正在尝试为此创建单元测试,而不是集成测试。 到目前为止,我已经设法解决了应该抛出的异常,并且@Retryable甚至没有重试,该方法只是抛出了异常,仅此而已。

这是使用Retryable批注的组件:

@Component
public class OurComponent {

    @Retryable(maxAttempts = 10,
            backoff = @Backoff(delay = 2000),
            value = {someException.class}
    )
    public void someMethod(SomeObject someObject) throws someException {
        Object createObject = anotherMethod(someObject); //this method throws someException
        ...
    }
}

以及使用此ourComponent的服务:

@Service
public class someService {

    private final OurComponent ourComponent;

    public SomeService(OurComponent ourComponent) {
         this.ourComponent = ourComponent;
    }

    ...


    public void methodUsingComponent() {
         SomeObject someObject = new SomeObject(args);
         ourComponent.someMethod(someObject);
    }
}

现在,我尝试使用@InjectMocks和@MockBean这个服务和组件,但是仍然无法正常工作。 甚至不进行集成测试就可以测试@Retryable注释吗?

如果您使用根本不使用spring的单元测试,则将无法轻松对其进行测试。

这是由于这样的事实,Spring会识别出这样的注释,并且相应的bean被运行时生成的代理包装,该代理实现了“重试”逻辑。

现在,如果您没有触发所有此机制的spring,则此@Retryable注释基本上是无用的,mockito对此一无所知,Junit也不知道。

您可以尝试手动创建一个这样的代理(检查spring-retry调用的逻辑),但这看起来有些过头了。 坦白说,它什么也没给你。 单元测试应该检查代码的功能,而不是检查弹簧重试背后由其他地方实现并经过测试的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM