• [转] fitnesse中的Map处理


    http://blog.csdn.net/doubeizhucele/article/details/42263887

    fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将是table格式(userguide中提到可以改变hashtable的css样式)

    ======   Java 代码   =========

        public Map getMap(Map map) {
            Set set =map.keySet();
            for(Object key:set){
                System.out.println(key+":"+map.get(key));
            }
            return map;
        }

    ====== fitnesse脚本  ============

    !define teacher [!{name:laozhang,tech:Math}]
    !define xiaoming [!{name:tom,age:18,teacher:${teacher}}]

    |script|!-Test-!                 |
    |$a=   |getMap;      |${xiaoming}|

    ==== 执行结果  =======

    ======  分析原因  =================

    1. 修改代码

    public Map getMap(Map map) {
            Set set =map.keySet();
            for(Object key:set){
                System.out.println(key+":"+map.get(key).getClass().getName());
            }
            return map;
        }

    2.  执行fitnesse脚本后,查看日志,发现teacher的value是String型,而不是hashtable对象

    age:java.lang.String
    name:java.lang.String
    teacher:java.lang.String

    3. 再次修改代码

        public Map getMap(Map map) {
            Map output = new HashMap();
            Set set = map.keySet();
            for (Object key : set) {
                System.out.println(key+":"+hashtableString2Map((String) map.get(key)));
                output.put(key, hashtableString2Map((String) map.get(key)));
            }
            return output;
        }

    4. 执行fitnesse脚本后,查看输出结果和日志

    age:18
    name:tom
    teacher:{name=laozhang, tech=Math}

    5. 再次分析原因,发现fitnesse会把map接口对象自动视为hashtable(应该是为了fitnesse展现出较好的样式,但是如果把结果对象作为参数传入到其他方法内,可能会造成不可预期的错误,比如JSONObject的fromObject方法),为了避免可能的错误,需要把输出类型强制转换为HashMap,代码如下

        public HashMap getMap(Map map) {
            Map output = new HashMap();
            Set set = map.keySet();
            for (Object key : set) {
                System.out.println(key+":"+hashtableString2Map((String) map.get(key)));
                output.put(key, hashtableString2Map((String) map.get(key)));
            }
            return (HashMap) output;
        }

    ==== 新增方法hashtableString2Map ============

    public static Object hashtableString2Map(String hashtableString) {
            if (hashtableString.startsWith("<table class="hash_table">")
                    && hashtableString.endsWith("</table>")) {
                Map map = new HashMap();
                Document document = XMLParser
                        .getDocumentFromString(hashtableString);
                Element parent = XMLParser.getRootNode(document);
                List hash_rows = parent.elements();
                String key = "";
                String value = "";
                for (int i = 0; i < hash_rows.size(); i++) {
                    Element hash_row = (Element) hash_rows.get(i);
                    List hashtableList = hash_row.elements();
                    for (int j = 0; j < hashtableList.size(); j++) {
                        Element ele = (Element) hashtableList.get(j);
                        String attrValue = ele.attributeValue("class");
                        if ("hash_key".equals(attrValue)) {
                            key = ele.getText();
                        } else if ("hash_value".equals(attrValue)) {
                            value = ele.getText();
                        }
                        map.put(key, value);
                    }
                }
                return map;
            }
            return hashtableString;
        }

    再次执行fitnesse脚本,得到结果

  • 相关阅读:
    【react】---react中使用装饰器
    【react】---react中key值的作用
    【react】---react项目中如何使用iconfont
    【react】---redux-actions的基本使用---【巷子】
    linux查看硬件配置
    ssh实现内网穿透
    base_convert()函数探秘及小bug记录
    【转】ASCII码表
    【转载】在C语言中,double、long、unsigned、int、char类型数据所占字节数
    xdebug及phpstorm、vim+dbgpy远程调试配置以及xdebug profile+webgrind笔记
  • 原文地址:https://www.cnblogs.com/shengs/p/6582749.html
Copyright © 2020-2023  润新知