JUnit 5混合聚合与直接绑定引发ParameterResolutionException问题咨询
解决JUnit 5参数化测试同时使用聚合器与直接参数绑定的ParameterResolutionException问题
你遇到的ParameterResolutionException确实是因为JUnit无法确定直接绑定的message参数对应的CSV列索引——默认情况下,JUnit不知道你的PersonAggregator消耗了多少个参数,所以无法自动分配后续参数的列位置。下面给出两种可行的解决办法:
方法一:给直接绑定的参数添加@Index注解
直接在message参数上标注@Index,明确指定它对应的CSV列索引(索引从0开始,这里message是第3列,对应索引2):
修改后的测试方法代码:
import org.junit.jupiter.params.indexer.Index; // ... 其他导入保持不变 @ParameterizedTest @CsvSource({ "Alice, 30, 'Hello Alice!'", "Bob, 40, 'Hello Bob!'" }) void testPersonGreeting(@AggregateWith(PersonAggregator.class) Person person, @Index(2) String message) { assertEquals("Hello " + person.name() + "!", message); }
方法二:让聚合器实现AggregatorConfiguration接口
让PersonAggregator实现AggregatorConfiguration接口,明确告诉JUnit它消耗的参数数量,这样JUnit会自动计算后续参数对应的列位置:
修改后的PersonAggregator代码:
import org.junit.jupiter.params.aggregator.AggregatorConfiguration; // ... 其他导入保持不变 static class PersonAggregator implements ArgumentsAggregator, AggregatorConfiguration { @Override public Person aggregateArguments(ArgumentsAccessor accessor, ParameterContext context) { return new Person(accessor.getString(0), accessor.getInteger(1)); } @Override public int getArgumentCount() { return 2; // 声明该聚合器使用2个参数 } }
此时测试方法无需修改,JUnit会自动识别聚合器用了前2列,message对应第3列。
内容的提问来源于stack exchange,提问作者Silas_229
相关产品推荐
相关产品推荐

