我正在为使用 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 字段”嵌套在 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”的道路。有没有更好的方法来解决这个问题?还是我在“正确”的道路上?