|
先看下重构前的测试用例:

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