我已經開始在我的單元和集成測試中使用Commons JXPath,作爲在Bean層次結構中設置一組屬性的簡單方法。如何讓JXPath乾淨地設置列表/集合條目
我無法「乾淨地」使用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。
有沒有更乾淨的方法來做到這一點?