如何在Java中使用Cucumber数据表匹配包含("${")的参数值



我有下面的Cucumber场景和数据表。我想在REST Assured框架中设置查询参数。这里我们有key= atvalue=${atToken},我试图获得运行时值,而不是通过数据表传递硬编码值。在下面的setParams方法中,我试图使用param.contains("${")匹配${atToken},但无法获得所需的结果。请让我知道我需要在这个for循环中更改什么。

for (String param : params.keySet()) {
if (param.contains("${")) {
params.replace(param, RUN_TIME_DATA.get(param));
}
}

功能文件:

And I set query parameters
| location     | NY         |
| at           | ${atToken} |

步骤定义:

@And("set {} parameters")
public void set_query_parameters(String query, DataTable params) throws IOException {
POC.setParams(query, params.asMap());
}

Utils文件:

public void setParams (String type, Map < String, String > params) throws IOException {
for (String param : params.keySet()) {
if (param.contains("${")) {
params.replace(param, RUN_TIME_DATA.get(param));
}
}
switch (type.toLowerCase()) {
case "form":
request.formParams(params);
break;
case "query":
request.queryParams(params);
break;
case "path":
request.pathParams(params);
break;
}
}

挂钩文件:

@Before
public void beforeScenario() throws Exception {
RUN_TIME_DATA.put("atToken", POC.createAuth());
}

如果我正确理解了您的quetion,那么您的实现存在一些问题。

首先,您有一个名为And I set query parameters的小黄瓜指令,但步骤定义是@And("set {} parameters")

正如你所定义的";查询";在您的步骤定义中,我假设您有这样的场景。

Scenario Outline: Params scenario
Given ...
When ...
Then ...
And I set "<queryType>" parameters
| location | NY         |
| at       | ${atToken} |
Examples:
| queryType |
| form      |
| path      |

第二个问题是params.asMap()不创建可变映射,但您的setParams方法需要一个可变映射。

@And("I set {string} parameters")
public void set_query_parameters(String queryType, DataTable params) throws IOException {
// POC.setParams(queryType, params.asMap()); // not mutable map
POC.setParams(queryType, new HashMap(params.asMap()));
}

your loop中的主要问题是在key而不是value中搜索$符号。

public void setParams (String type, Map<String, String> params) throws IOException {
for (Map.Entry<String, String> entry : params.entrySet()) {
final String key = entry.getKey();
final String value = entry.getValue();
// if value is parameterized
if (value.contains("${")) {
// you are using stripped value as key in your RUN_TIME_DATA
final String keyInRuntimeMap = getParamKeyFrom(value);                      
params.replace(key, RUN_TIME_DATA.get(keyInRuntimeMap));
}
}
switch (type.toLowerCase()) {
case "form":
request.formParams(params);
break;
case "query":
request.queryParams(params);
break;
case "path":
request.pathParams(params);
break;
// what should happen if unknown type given
default:
throw new IllegalArgumentException("unknown type=" + type);
}
}
/**
* Will strip someKey from ${someKey}
*
* @param text
* @return stripped text or the original text
*/
private String getParamKeyFrom(final String text) {
// pattern to match -> ${someKey}
final Pattern pattern = Pattern.compile("\$\{(.*)\}");
final Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
return matcher.group(1);
}
// if pattern does not match return the same string
return text;
}

希望能有所帮助。

最新更新