我正在为使用Cucumber(-JVM),Junit,Java 8接受XML文件(包含多达数百个字段)的应用程序创建验收测试框架。我创建了一个库,可以将POJO序列化为XML使用Builder接口的类(避免使用几十个构造函数并具有各种声明性API),即:
new Form.Builder
.setThisField(withThis)
.setThatField(withThat)
.build();
我创建了这个库,因为我想在我的测试中动态生成有效的XML文件。我希望我的黄瓜场景像英文一样阅读,所以我决定使用数据表而不是编写类似的东西:
Given I have a form with x field
and with y field
and with z field
and ...
有50种不同的'和'线。所以他们看起来像这样:
Given that I have Form B101 with the following fields:
| X Field | X Value |
| Y Field | Y Value |
| Z Field | Z Value |
问题:
我希望黄瓜数据表中的键(转换为HashMap)映射到构建器模式的方法名称。起初我以为使用lambdas和方法引用可以让我实现这个目标,但我还没有找到方法。
所以我的下一个想法是反思。我决定将Cucumber Data表键中的映射存储到属性文件中的方法名称,如:
//mapping.properties
X\ Field = setXField
// the \ after X is to escape the space
我遇到了一个问题:黄瓜数据表中的一些字段映射到我的XML数据绑定库中的深层嵌套字段(由于XML模式)。例如:
" X Field"嵌套在A字段中。所以在我的测试方法中,我需要这样做:
AField aField = new AField(new XField());
但是使用java中的反射,你需要在事实之前知道参数数据类型(或者我认为)。例如,如果我想找出与方法关联的参数类型:
Class[] paramString = new Class[1];
paramString[0] = AField.class;
// So I need to know before the fact that methodName (below) has a parameter
// of type AField in order to .... get the parameter types of methodName.
// this is legal because a method with methodName exists and it takes
// one parameter with type AField.
Class[] parameterTypes =
formB.getClass().getMethod(methodName, paramString).getParameterTypes();
// this is not legal. no method named methodName which doesn't
// take parameters exists
Class[] parameterTypes =
formB.getClass().getMethod(methodName).getParameterTypes();
我确定我可以为此找到解决方法,但最终我似乎已经找到了一个“hacky'路径。有没有更好的方法来解决这个问题?或者我是否正确对待'路径?
答案 0 :(得分:1)
冒着导致版主愤怒的风险(明确的答案比链接更受欢迎),我会指出你link。要将List添加到HashMap,请考虑[this]
编辑
以下是引用链接中相关部分的摘录。
将两列表转换为Map。
Feature: Cucumber can convert a Gherkin table to a map.
This an example of a simple price list.
Scenario: A price list can be represented as price per item
Given the price list for a coffee shop
| coffee | 1 |
| donut | 2 |
When I order 1 coffee and 1 donut
Then should I pay 3
代码:
package se.thinkcode.steps;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class SimplePriceList {
private Map<String, Integer> priceList;
private int totalSum;
@Given("^the price list for a coffee shop$")
public void the_price_list_for_a_coffee_shop(Map<String, Integer> priceList) throws Throwable {
this.priceList = priceList;
}
@When("^I order (\\d+) (.*) and (\\d+) (.*)$")
public void i_order_coffee_and_donut(int numberOfFirstItems, String firstItem,
int numberOfSecondItems, String secondItem) throws Throwable {
int firstPrice = priceList.get(firstItem);
int secondPrice = priceList.get(secondItem);
totalSum += firstPrice * numberOfFirstItems;
totalSum += secondPrice * numberOfSecondItems;
}
@Then("^should I pay (\\d+)$")
public void should_I_pay(int expectedCost) throws Throwable {
assertThat(totalSum, is(expectedCost));
}
}