我已经开始在我的单元和集成测试中使用 Commons JXPath,作为在 bean 层次结构中设置一组属性的简单方法。
我不能“干净地”使用 JXPath 的一种情况是设置列表条目。
我真的很想让 JXPath 做“显而易见的事情”,这样如果我尝试设置列表的条目“[1]”(奇怪的是他们选择使用基于 1 的索引),它将配置基础列表至少有一个条目。从我所见,这不会发生,我必须手动完成。
例如,这里有一些我想写的代码:
JXPathContext context = JXPathContext.newContext(request);
context.setValue("foo", new Foo());
context.setValue("foo/subscriberNumber", "1234567890");
context.setValue("foo/bar", new Bar());
context.setValue("foo/bar/numbers[1]", "123"); // this fails
由于几个不同的原因,这不起作用。
第一个问题是“数字”列表属性将为空。我可以这样处理:
JXPathContext context = JXPathContext.newContext(request);
context.setValue("foo", new Foo());
context.setValue("foo/subscriberNumber", "1234567890");
context.setValue("foo/bar", new Bar());
context.setValue("foo/bar/numbers", new ArrayList<String>());
context.setValue("foo/bar/numbers[1]", "123");
或者我可以注册一个 AbstractFactory 并改用“createPathAndSetValue()”。
但是,这仍然失败,因为即使列表可能存在,它的大小也将为零并且无法访问第 0 个条目。
我被迫做这样的事情:
JXPathContext context = JXPathContext.newContext(request);
context.setValue("foo", new Foo());
context.setValue("foo/subscriberNumber", "1234567890");
context.setValue("foo/bar", new Bar());
context.setValue("foo/bar/numbers", Arrays.asList(""));
context.setValue("foo/bar/numbers[1]", "123");
如果我必须在列表中设置除第一个之外的其他条目,我将不得不使用更多虚拟条目来初始化列表。
我也会觉得有责任在任何地方添加评论以平息 WTF。
有没有更清洁的方法来做到这一点?