先看下重構前的測試用例:
public class TestLogin extends TestCase{ private ButtonManagerIbatis buttonManagerIbatis; protected void setUp() throws Exception { context = getContext(); buttonManagerIbatis = (ButtonManagerIbatis)context.getBean ("buttonManagerIbatis"); super.setUp(); } ApplicationContext context ; protected ApplicationContext getContext() { String[] paths = {"/context/application_context.xml"}; ApplicationContext ctx = new ClassPathXmlApplicationContext(paths); return ctx; } /** *//** * 測試:登陸後讀取權限信息,並且封裝為樹形結構 */ public void testLongin(){ List<Button> list = buttonManagerIbatis.getAuth("0000"); testall(list); } Map<String,Model> modelmap = new HashMap<String,Model>(); Map<String,Menu> fmenumap = new HashMap<String,Menu>(); Map<String,Menu> smenumap = new HashMap<String,Menu>(); public void testall(List<Button> buttonList){ for(Button button :buttonList){ test(modelmap,button); } for(Model model : modelmap.values()){ test2(smenumap,model); } for(Menu menu : smenumap.values()){ test3(fmenumap,menu); } for(Menu fmenu :fmenumap.values() ){ System.out.println(fmenu.getMenuName()); for(Menu smenu :fmenu.getMenus() ){ System.out.println(" "+smenu.getMenuName()); for(Model model : smenu.getModels()){ System.out.println(" "+model.getName()); for(Button b:model.getButtons()){ System.out.println(" "+ b.getButtonDesc()); } } } } } public void test(Map<String,Model> modelmap , Button b){ Model m = b.getModel(); if(!modelmap.containsKey(m.getId())) modelmap.put(m.getId(),m); modelmap.get(m.getId()).getButtons().add(b); } public void test2(Map<String,Menu> menumap , Model m){ Menu menu = m.getMenu(); if(!menumap.containsKey(menu.getId())) menumap.put(menu.getId(),menu); menumap.get(menu.getId()).getModels().add(m); } public void test3(Map<String,Menu> menumap , Menu smenu){ Menu fmenu = smenu.getMenu(); if(!menumap.containsKey(fmenu.getId())) menumap.put(fmenu.getId(),fmenu); menumap.get(fmenu.getId()).getMenus().add(smenu); } }
這裡有3個方法 test, test2 ,test3 考慮到以後還可能有變化,所以想把他們合成一個方法,首先考 慮到了反射
public void testC(Map map , Object t , String parent ,String childrenname){ try { Object t_parent = BeanUtils.getDeclaredProperty(t, parent); Object t_parent_id = BeanUtils.getDeclaredProperty(t_parent, "id"); if(!map.containsKey(t_parent_id)){ map.put(t_parent_id, t_parent); } Object o = map.get(t_parent_id); Collection t_collection =(Collection)BeanUtils.getDeclaredProperty(o, childrenname); t_collection.add(t); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } }
於是修改後的測試用例為:
public class TestLogin extends TestCase{ private ButtonManagerIbatis buttonManagerIbatis; protected void setUp() throws Exception { context = getContext(); buttonManagerIbatis = (ButtonManagerIbatis)context.getBean ("buttonManagerIbatis"); super.setUp(); } ApplicationContext context ; protected ApplicationContext getContext() { String[] paths = {"/context/application_context.xml"}; ApplicationContext ctx = new ClassPathXmlApplicationContext(paths); return ctx; } public void testLongin(){ List<Button> list = buttonManagerIbatis.getAuth("0000"); testall(list); } Map<String,Model> modelmap = new HashMap<String,Model>(); Map<String,Menu> fmenumap = new HashMap<String,Menu>(); Map<String,Menu> smenumap = new HashMap<String,Menu>(); public void testall(List<Button> buttonList){ for(Button button :buttonList){ testC(modelmap,button,"model","buttons"); } for(Model model : modelmap.values()){ testC(smenumap,model,"menu","models"); } for(Menu menu : smenumap.values()){ testC(fmenumap,menu,"menu","menus"); } for(Menu fmenu :fmenumap.values() ){ System.out.println(fmenu.getMenuName()); for(Menu smenu :fmenu.getMenus() ){ System.out.println(" "+smenu.getMenuName()); for(Model model : smenu.getModels()){ System.out.println(" "+model.getName()); for(Button b:model.getButtons()){ System.out.println(" "+ b.getButtonDesc()); } } } } } /** *//** * * @param map * @param b */ @SuppressWarnings("unchecked") public void testC(Map map , Object t , String parent ,String childrenname){ try { Object t_parent = BeanUtils.getDeclaredProperty(t, parent); Object t_parent_id = BeanUtils.getDeclaredProperty(t_parent, "id"); if(!map.containsKey(t_parent_id)){ map.put(t_parent_id, t_parent); } Object o = map.get(t_parent_id); Collection t_collection =(Collection)BeanUtils.getDeclaredProperty(o, childrenname); t_collection.add(t); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } }
例外 BeanUtils中的 反射方法:
static public Object getDeclaredProperty(Object object, String propertyName) throws IllegalAccessException, NoSuchFieldException { Assert.notNull(object); Assert.hasText(propertyName); Field field = object.getClass().getDeclaredField(propertyName); return getDeclaredProperty(object, field); }