我有一个使用@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注释吗?
答案 0 :(得分:0)
如果您使用根本不使用spring的单元测试,则将无法轻松对其进行测试。
这是由于这样的事实,Spring会识别这样的注释,并且相应的bean被运行时生成的代理包装,该代理实现了“重试”逻辑。
现在,如果您没有触发所有这种机制的spring,那么这个@Retryable
注释基本上是没有用的,mockito对此一无所知,Junit也不知道。
您可以尝试手动创建一个像这样的代理(检查spring-retry调用的逻辑),但是看起来太过分了。坦白说,它什么也没给你。单元测试应该检查代码的功能,而不是检查弹簧重试背后由其他地方实现并经过测试的逻辑。