一、问题
做测试时,写了两个test case,期望先执行bindByBadData再执行bindByCorrectData。以为Junit是按方法位置的先后顺序来执行的,执行时发现并不是,与预期的执行顺序相反,如图:
二、解决办法
Junit 4.11里增加了指定测试方法执行顺序的特性,测试类的执行顺序可通过对测试类添加注解 @FixMethodOrder(value) 来指定,其中value 为执行顺序。三种执行顺序可供选择:
1、默认(MethodSorters.DEFAULT);
2、按方法名(MethodSorters.NAME_ASCENDING);
3、JVM(MethodSorters.JVM);
当没有指定任何顺序时,按默认来执行,代码调整后,如图:
三、拓展
MethodSorters.DEFAULT
默认顺序由方法名hashcode值来决定,如果hash值大小一致,则按名字的字典顺序确定由于hashcode的生成和操作系统相关(以native修饰),所以对于不同操作系统,可能会出现不一样的执行顺序,在某一操作系统上,多次执行的顺序不变。MethodSorters.NAME_ASCENDING (推荐)
按方法名称的进行排序,由于是按字符的字典顺序,所以以这种方式指定执行顺序会始终保持一致;不过这种方式需要对测试方法有一定的命名规则,如 测试方法均以test_NN_fun命名(NN表示测试方法序列号 01-99)如:test_01_bindByBadData、test_02_bindByCorrectDataMethodSorters.JVM
按JVM返回的方法名的顺序执行,此种方式下测试方法的执行顺序是不可预测的,即每次运行的顺序可能都不一样(JDK7里尤其如此).