升级Cucumber至v6.8.1后,如何向DataTable传入空字符串?
解决Cucumber v6+中DataTable空单元格转空字符串的问题
我之前升级Cucumber的时候也踩过这个坑!从旧的info.cukes转到io.cucumber v6.x之后,默认的DataTable转换器确实把空单元格解析成null了,和旧版本直接返回空字符串的行为完全相反。下面给你几个可行的解决办法:
方法一:全局配置关闭空字符串转null
这是最省心的方式,直接通过配置修改默认行为。你可以在项目的cucumber.properties文件里添加一行:
cucumber.datatable.convert_empty_strings_to_null=false
或者如果用cucumber.yml管理多环境配置,就在对应的环境下加上这个配置项。设置之后,所有DataTable里的空单元格都会被解析成空字符串,不需要修改任何测试代码。
方法二:手动转换单个DataTable的null值
如果不想全局修改,只针对某几个测试用例处理,可以在拿到解析后的maps之后,手动把null替换成空字符串:
@When("Passing empty string as second parameter") public void test_definition(DataTable dataTable) { List<Map<String, String>> maps = dataTable.asMaps(String.class, String.class); // 遍历替换所有null值为空字符串 maps.forEach(row -> row.replaceAll((key, value) -> value == null ? "" : value)); System.out.println(maps); // 现在输出就是[{first=simple, second=}] }
方法三:自定义TypeRegistryConfigurer全局控制转换逻辑
如果需要更灵活的转换规则(比如不同类型有不同处理),可以自定义一个类型注册配置类,让Cucumber按照你的规则解析单元格:
import io.cucumber.core.api.TypeRegistry; import io.cucumber.core.api.TypeRegistryConfigurer; import io.cucumber.datatable.TableCellTransformer; import java.util.Locale; public class CucumberDataTableConfig implements TypeRegistryConfigurer { @Override public Locale locale() { return Locale.ENGLISH; } @Override public void configureTypeRegistry(TypeRegistry typeRegistry) { // 注册字符串类型的单元格转换器,null转空字符串 TableCellTransformer<String> stringTransformer = cell -> cell == null ? "" : cell; typeRegistry.setDefaultDataTableCellTransformer(stringTransformer); } }
只要这个类在Cucumber的扫描路径下(比如和你的step定义类同一个包),它就会自动生效,所有字符串类型的DataTable单元格都会把null转换成空字符串。
内容的提问来源于stack exchange,提问作者makozaki
相关产品推荐
相关产品推荐

