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

时间:2019-09-18 08:37:57

标签: spring spring-boot unit-testing junit mockito

我有一个使用@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注释吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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