如何在Picocli单元测试中获取并验证选项的赋值是否正确
单元测试中获取Picocli选项绑定值的方案
Picocli提供了两种直接的方式获取选项关联值,你可以根据场景选择:
方案1:通过ParseResult对象读取
你已经拿到了解析后的ParseResult实例,可以直接调用对应API获取值:
- 读取选项值:调用
parseResult.matchedOptionValue(选项名, 默认值)一步获取,或者先通过matchedOption(选项名)拿到OptionSpec再调用getValue()方法 - 读取位置参数值:调用
parseResult.matchedPositionalValue(参数索引, 默认值)获取
方案2:直接读取命令类实例的属性
Picocli完成参数解析后,会自动把值注入到你初始化的NextMajorSubcommand实例的对应字段中,你直接调用字段的getter或者直接访问public字段就能拿到值,这种方式更简洁。
改造后的测试代码示例
@Test void callWithOptionForSuffix() { NextMajorSubcommand command = new NextMajorSubcommand(); CommandLine cmdline = new CommandLine(command); ParseResult parseResult = cmdline.parseArgs("--suffix", "DELTA", "4.5.6"); // ParseResult方式断言 assertThat(parseResult.hasMatchedPositional(0)).isTrue(); assertThat(parseResult.matchedOptions()).isNotEmpty(); assertThat(parseResult.matchedOption("--suffix").isOption()).isTrue(); // 断言--suffix选项值 assertThat(parseResult.matchedOptionValue("--suffix", "")).isEqualTo("DELTA"); // 断言位置参数值 assertThat(parseResult.matchedPositionalValue(0, "")).isEqualTo("4.5.6"); // 命令对象直接断言(更推荐,可同时验证注解绑定正确性) // 假设NextMajorSubcommand中@Option(name = "--suffix")标注的字段对应的getter为getSuffix assertThat(command.getSuffix()).isEqualTo("DELTA"); // 假设位置参数绑定到的字段对应的getter为getVersion assertThat(command.getVersion()).isEqualTo("4.5.6"); }
补充说明
- 如果你的选项配置了短别名,比如
-s是--suffix的短名,传入短名也能正常匹配到对应的选项 - 如果是可重复选项,返回的值为对应集合类型,直接强转后即可断言
- 如果你需要校验未匹配选项的默认值,直接读命令对象的字段值更方便
内容的提问来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

