解析的值与xml中的原始值不同

时间:2011-06-29 09:31:37

标签: java junit

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;
}

1 个答案:

答案 0 :(得分:0)

代码parser.parseAsList(impactsUrl)很可能与您的预期不同,并且此测试检测到它正在测试的代码中的错误。

发布ImpactsParser的代码,我们或许可以帮助找出它出错的地方。

修改

根据现在为ImpactsParser发布的代码,您在ImpactInfo项目列表中生成的元素多于文档中的<impact>个标记,这可能正是您想要的做,但可能是你误解的事情。

每次找到<impact>标记时,您都会从属性中获取onObjecttoObject个标记集,循环显示组合对(这些标记中只有一个)示例xml示例,并通过调用未显示的函数为每个创建一个ImpactInfo对象。

如果创建的对象具有“条件”,可能是由<condition>标记的存在触发,则您为每个条件创建另一个 ImpactInfo对象,然后添加它们到列表。这是我怀疑你可能真的不想要的,但我当然并不真正知道你想要的

说出错的是很难超越这个,因为我不清楚预期的正确工作是什么。

你真正应该做的是在测试集合中定义不同输入位的预期结果(使用断言而不是System.out.println)并尝试通过修改代码来使测试通过。从最简单的案例开始。