如何用@RetryingTest替代@ParameterizedTest并解决参数解析异常?
解决JUnit 5参数化测试结合重试的问题
问题场景
原本的参数化测试代码如下:
@ParameterizedTest @MethodSource("getTestData") fun fooTest( arg1: Int, arg2: Int, arg3: String, ) { ... }
由于该测试和不稳定的测试容器交互(无法优化稳定性),需要添加重试机制。引入JUnit Pioneer依赖后,将@ParameterizedTest替换为@RetryingTest,代码变为:
@RetryingTest(maxAttempts = 3, minSuccess = 1, suspendForMs = 1000) @MethodSource("getTestData") fun fooTest( arg1: Int, arg2: Int, arg3: String, ) { ... }
但测试报错No ParameterResolver registered for parameter [int arg1],无法识别@MethodSource提供的参数。
解决方案
@RetryingTest本身不支持参数化,不能直接替代@ParameterizedTest。正确的做法是保留@ParameterizedTest,结合JUnit Pioneer的@RetryOnFailure注解来实现重试逻辑:
- 确保使用JUnit Pioneer 2.2.0及以上版本的依赖
- 修改测试代码:
@ParameterizedTest @MethodSource("getTestData") @RetryOnFailure(maxAttempts = 3, suspendForMs = 1000) fun fooTest( arg1: Int, arg2: Int, arg3: String, ) { ... }
@RetryOnFailure会为每个参数化测试用例单独执行重试逻辑,当某个用例失败时,会自动重试指定次数,同时保留参数化测试的参数解析能力。
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

