欢迎来到天天文库
浏览记录
ID:30881206
大小:160.78 KB
页数:11页
时间:2019-01-04
《追求代码质量(11)-用aop进行防御性编程-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、追求代码质量(11):用AOP进行防御性编程-编程开发技术追求代码质量(11):用AOP进行防御性编程原文出处:IBM中国开发人员测试的主要缺点是:绝大部分测试都是在理想的场景屮进行的。在这些情况下并不会出现缺陷一一能导致出现问题的往往是那些边界情况。什么是边界情况呢?比方说,把?null?值传入一个并未编写如何处理?null?值的方法中,这就是一种边界情况。大多数开发人员通常都不能成功测试这样的场景,因为这没多大意义。但不管有没有意义,发生了这样的情况,就会抛出一个?NullPointerExcep
2、tion,然后整个程序就会崩溃。本刀,我将为您推荐一种多层面的方法,来处理代码中那些不易预料的缺陷。尝试为应用程序整合进防御性编程、契约式设计和-•种叫做OVal的易用的通用验证框架。将敌人暴露出来清单1中的代码为给定的?Class?对象(省去了?java.lang.Object,因为所有对象都最终由它扩展)构建一个类层次。但如果仔细看的话,您会注意到一个有待发现的潜在缺陷,即该方法对对象值所做的假设。清单1.不检验null的方法publicstaticHierarchybuildHierarchy(
3、Classclzz){Hierarchyhier二newHierarchyO;hier.setBaseClass(clzz);Classsuperclass二clzz.gctSuperclass();if(superclass!=null&&superclass.getName().equals(/zjava.lang.Object")){returnhier;}else{while((clzz.getSuperclass()!=null)&&(!clzz.getSuperclass().getNam
4、e().equals(/zjava.lang.Object"))){clzz二clzz.getSuperclass();hier.addClass(clzz);returnhier;}}刚编好这个方法,我还没注意到这个缺陷,但由于我狂热地崇拜开发人员测试,于是我编写了一个使用TestNG的常规测试。而且,我述利用了TestNG方便的?DataProvider?特性,借助该特性,我创建了一个通用的测试用例并通过另一个方法來改变它的参数。运行清单2中定义的测试用例会产生两个通过结果!一切都运转良好,不是吗
5、?清单2.验证两个值的TestNG测试importjava,util.Vector;importstaticorg.testng.Assert.asscrtEquals;importorg.testng.annotations.DataProvider;importorg.testng.annotations.Test;publicclassBui1dHierarchyTest{@DataProvider(name="class-hierarchies")publicObject[][]dataVal
6、ues(){returnnewObject[][]{{Vector,class,newString[]{/zjava.util.AbstractLisz/java,ut订.AbstractCollcctioiW{String,class,newString[]{}}};}@Tcst(dataProvidcr二"class-hierarchies"})publicvoidverifyHierarchies(Classclzz,String[]names)throwsException!Hierarchy
7、hier二HierarchyBuilder.buildHierarchy(clzz);assertEquals(hier.getHierarchyCleissNennes(),names,"valueswerenotequal");}至此,我还是没有发现缺陷,但一些代码问题却困扰着我。如果有人不经意地为?Class?参数传入一个?null?值会怎么样呢?清单1?中第4行的clzz.gctSuperclass()?调用会抛出一个?NullPointcrExccption,是这样吗?测试我的理论很容易;其
8、至都不用从头开始。仅仅把?{null,null}?添加到初始?Bui1dHierarchyTest?的?dataValues?方法中的多维?Object?数组中,然后再次运行它。我定会得到如图1所示的?NullPointerException:Gyrate4止■图L可怕的NulIPointerExceptionAG逢MZsFatedTestseaAdM(^iwo)0.venFytterttdtes3sw/)ttarMdm(i]=eExcapoan多1"a
此文档下载收益归作者所有