基本类型传参正则
最近在使用cucumber的时候一直找不到double该使用什么正则,官网上只有int的例子,其他资料也一直找不到。最后终于在源码调试的时候,在Runtime.loadBackends里发现了对应的正则,特此记下。
类型 | 正则 |
---|---|
biginteger | "-?\d+" 或者 "\d+" |
string | ""([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'" |
bigdecimal | "-?\d*[.,]\d+" |
byte | "-?\d+" 或者 "\d+" |
double | "-?\d*[.,]\d+" |
short | "-?\d+" 或者 "\d+" |
float | "-?\d*[.,]\d+" |
word | "\w+" |
int | "-?\d+" 或者 "\d+" |
long | "-?\d+" 或者 "\d+" |
其中String也可以用.*
这些正则应该是cucumber表达式使用的正则,word和官网的一样,而且string都需要加双引号或者单引号。可能cucumber表达式最后就是根据这些类型转换成正则表达式吧。
自定义类型
文档1
文档2
一开始以为自定义类型只能在cucumber表达式里使用,后来由于cucumber for java这个插件对cucumber表达式支持的不太好,只能研究使用正则表达式。后来尝试了一下,原来自定义类型其实就是根据正则匹配后,调用transform转换成自定义类型的类后,作为入参使用的。所以在正则表达式里使用自定义类型使用的正则,然后在入参里就可以使用定义返回的class了
@Override
public void configureTypeRegistry(TypeRegistry typeRegistry) {
//View是一个枚举类,就不列出了
typeRegistry.defineParameterType(new ParameterType<>(
"view",
"视图1|视图2|视图3",
View.class,
View::getViewByName
));
}
@Given("^(视图1|视图2|视图3)$")
public void testCustomParameterTypes( View view) {
// 视图1|视图2|视图3 就被转换成枚举View
}
update at 2018年11月05日14:45:47
今天用正则表达式对long入参的时候,使用(\d+)。但是报无法解析类型,一直以为是另一个参数出错了,结果进cucumber源码调试的时候,发现(\d+)被固定解析为int。很不理解,之前以为相同正则不同类型的时候,cucumber会根据入参类型,解析成对应的类型,但是实际并不是。下面摘录ParameterTypeRegistry类的一段代码。
public <T> ParameterType<T> lookupByRegexp(String parameterTypeRegexp, Pattern expressionRegexp, String text) {
SortedSet<ParameterType<?>> parameterTypes = parameterTypesByRegexp.get(parameterTypeRegexp);
if (parameterTypes == null) return null;
if (parameterTypes.size() > 1 && !parameterTypes.first().preferForRegexpMatch()) {
// We don't do this check on insertion because we only want to restrict
// ambiguity when we look up by Regexp. Users of CucumberExpression should
// not be restricted.
List<GeneratedExpression> generatedExpressions = new CucumberExpressionGenerator(this).generateExpressions(text);
throw new AmbiguousParameterTypeException(parameterTypeRegexp, expressionRegexp, parameterTypes, generatedExpressions);
}
return (ParameterType<T>) parameterTypes.first();
}
以(\d+)为例子,注册的parameterTypesByRegexp有5个:int,long等(上面表格里有),但是在返回的时候,固定返回第一个,即int
return (ParameterType<T>) parameterTypes.first();
注释上说在使用正则的时候想避免歧义,建议使用cucumber表达式。我改用cucumber表达式确实能解决问题,但是IDEA上cucumber for java插件又没有对cucumber表达式的支持,feature文件里语句写错了也不知道,实在很纠结。
后来查了下,IDEA2018.3版本修改了这个问题,现已推出EAP版本,正式版估计也快了。下载了2018.3版本后,实测可行。