protected void setUp() throws Exception {
super.setUp();
URL impactsUrl = ImpactsParserTest.class.getResource("test-impacts.xml");
ImpactsParser parser = new ImpactsParser();
this.impacts = parser.parseAsList(impactsUrl);
}
public void testImpactsParsing() {
System.out.println(this.impactInfo = (ImpactInfo)this.impacts.get(0));
System.out.println(this.impactInfo = (ImpactInfo)this.impacts.get(1));
它给出的值与我下面给出的测试xml不同:
ImpactInfo onObject='impact1' onAction='show' toObject='impacted1' toAction='onshow' value='true' reversible='true'
ConditionInfo: onObject='impact1.dcr1' onAction='show' value='true'
ConditionInfo: onObject='impact1.dcr2' onAction='show' value='false'
ConditionInfo: onObject='impact1.dcr3' onAction='onshow' value='true'
ImpactInfo onObject='impact1.dcr1' onAction='onshow' toObject='impacted1' toAction='onshow' value='true' reversible='true'
ConditionInfo: onObject='impact1' onAction='show' value='true'
ConditionInfo: onObject='impact1.dcr2' onAction='show' value='false'
ConditionInfo: onObject='impact1.dcr3' onAction='onshow' value='true'
而xml文件包含,
测试impacts.xml:
<impacts>
<impact onObject="impact1" onAction="show" toObject="impacted1" toAction="onshow" value="true">
<condition onObject="impact1.dcr1" onAction="show" value="true"/>
<condition onObject="impact1.dcr2" onAction="show" value="false"/>
<condition onObject="impact1.dcr3" onAction="onshow"/>
</impact>
<impact onObject="impact2" onAction="select" toObject="impacted2" toAction="onselect" value="false">
<condition onObject="impact2.dcr1" onAction="onshow" value="true"/>
<condition onObject="impact2.dcr2" onAction="onselect" value="false"/>
<condition onObject="impact2.dcr3" onAction="show"/>
<condition onObject="impact2.dcr4" onAction="select"/>
</impact>
</impacts>
为什么我得到的值与原始xml值不同?
ImpactsParser.java:
public List<ImpactInfo> parseAsList(URL url) {
SAXReader reader = new SAXReader();
Document doc = reader.read(url);
Element descriptionsTag = doc.getRootElement();
return parseImpacts(descriptionsTag);
}
private List<ImpactInfo> parseImpacts(Element descriptionsTag) {
LinkedList<ImpactInfo> impacts = new LinkedList<ImpactInfo>();
for (Iterator<Element> iter = descriptionsTag.elementIterator(TAG_IMPACT); iter.hasNext();) {
Element ele = iter.next();
// iterate on all onObjects
Set<String> onObjectsSet = getValuesFromElementAttribute(ele, ATT_ON_OBJECT, ",");
Set<String> toObjectsSet = getValuesFromElementAttribute(ele, ATT_TO_OBJECT, ",");
for (Iterator<String> it = onObjectsSet.iterator(); it.hasNext();) {
String onObject = it.next();
for (Iterator<String> itt = toObjectsSet.iterator(); itt.hasNext();) {
ImpactInfo impactInfo = parseImpactInfo(onObject, itt.next(), ele);
impacts.add(impactInfo);
// create inverted impacts for impacts with conditions
if ((impactInfo.getConditions() != null) && (impactInfo.getConditions().size() > 0)) {
impacts.addAll(createInvertedImpacts(impactInfo));
}
}
}
}
return impacts;
}
protected Set<String> getValuesFromElementAttribute(Element element, String attributeName, String separator) {
Set<String> names = new HashSet<String>();
if (element.attribute(attributeName) != null) {
String[] dcrs = element.attribute(attributeName).getValue().split(separator);
for (int index = 0; index < dcrs.length; index++) {
if (dcrs[index] != null) {
names.add(dcrs[index].trim());
}
}
}
return names;
}
答案 0 :(得分:0)
代码parser.parseAsList(impactsUrl)
很可能与您的预期不同,并且此测试检测到它正在测试的代码中的错误。
发布ImpactsParser的代码,我们或许可以帮助找出它出错的地方。
修改强>
根据现在为ImpactsParser发布的代码,您在ImpactInfo
项目列表中生成的元素多于文档中的<impact>
个标记,这可能正是您想要的做,但可能是你误解的事情。
每次找到<impact>
标记时,您都会从属性中获取onObject
和toObject
个标记集,循环显示组合对(这些标记中只有一个)示例xml示例,并通过调用未显示的函数为每个创建一个ImpactInfo
对象。
如果创建的对象具有“条件”,可能是由<condition>
标记的存在触发,则您为每个条件创建另一个 ImpactInfo
对象,然后添加它们到列表。这是我怀疑你可能真的不想要的,但我当然并不真正知道你想要的。
说出错的是很难超越这个,因为我不清楚预期的正确工作是什么。
你真正应该做的是在测试集合中定义不同输入位的预期结果(使用断言而不是System.out.println
)并尝试通过修改代码来使测试通过。从最简单的案例开始。