在junit4中开始使用这样的包结构:org.junit.* ,而不再像以前使用这样的包结构:junit.framework.*,但是为了向后兼容,在Junit4中将会让这两种包结构并存
继承上的变化
你的测试类再也不需要extends这个类junit.framework.TestCase了,而且不用显示的继承任何一个类,Junit通过采用JDK 5.0的annotations特性来完成了这种转变。如果想要执行一个test case,只需要在你的测试类中至少包含一个这样的annotation可以了@Test。
打个比方,如果你写了这样的一个类,里面只包含了@Before 和 @After这样的annotation,却没有包含任何的@Test,那么在你开始运行这个测试类的时候,你会碰到一个java的异常:java.lang.Exception: No runnable methods.
断言方法的变化
因为在Junit 4中,测试类不再继承TestCase(在这个类里JUnit 3.8版本中定义了assertEquals()等方法),所以你需要使用一个前缀的语法像这样:Assert.assertEquals(),或者用JDK 5.0中的静态导入,来导入Assert,之后,你可以像之前那样使用assertEquals等等这些方法了
另外,在Junit 4中增加了两个新的断言方法,他们用来比较两个对象数组,如果两个数组中的每个元素都是equal的,那么认为这两个数组是equal的:
public static void assertEquals(String message, Object[] expecteds, Object[] actuals);
public static void assertEquals(Object[] expecteds, Object[] actuals);
还有12个assertEquals 方法已经因为JDK 5.0中的autoboxing功能而彻底消失了。像这样assertEquals(long, long) 之前在JUnit 3.8中使用的方法,现在已经都统一改用assertEquals(Object, Object)方法。
Fixture
Fixtures是在测试期间用来初始化(initialize)和释放(release)对象的一些方法,在 In JUnit 3.8中,需要用setUp() 方法在运行测试方法之前进行一些初始化的工作,然后在测试完成之后用tearDown() 方法来进行善后工作。这两个方法都是从父类TestCase 中override过来的,因此他们的方法声明及方法名称是固定的。在JUnit 4中我们只要使用这两个annotation:@Before 和 @After 可以达到同样的目的了,而且我们不用再强制的让方法必须叫这两个名字了。^_^
测试方法上的变化
在JUnit 3.8中,用来标识一个测试方法是通过它的方法签名来实现的,即方法必须以一个"test"的前缀来命名,且必须为void,而且必须没有任何参数(比如:public void testDivide()),那些不遵循这种命名规则的方法将会被简单的忽略掉,而且不会抛出任何异常来表面已经发生了错误。
在JUnit 4中没有命名上的限制了,只需要在测试方法的签名加上一个这样的annotation可以了:@Test,像之前的限制:方法必须为void,而且必须没有任何参数,这些还是一样需要,只是限制改为,如果没有遵守这些限制,则会在运行的时候抛出下面的异常:
java.lang.Exception: Method xxx should have no parameters
java.lang.Exception: Method xxx should be void
另外,@Test支持可选的expected参数,用来声明这个测试方法可以抛出一个异常,如果在测试时没有抛出异常,或者抛出了一个其他的异常,都会认为测试是失败的。比如可以这样来声明@Test(expected = ArithmeticException.class)。
忽略一个测试方法
如果你在测试之前知道某个方法测试一定会失败,但是,你又不想让测试失败,那么你怎么临时的让这个测试方法被忽略掉呢?在JUnit 3.8中要么将这个方法注释掉,要么需要改变方法名称,即不使用test前缀开头来命名方法,问题是当测试的方法很多时,你可能不记得你重命名过的这个方法了。而在JUnit 4中可以通过去掉方法前面的@Test annotation来达到目的,但是上面的问题依然存在,一个解决方案是:在需要测试的方法前/后即@Test的前面或者后面加上@Ignore 可以了,后在测试报告中将会显示出有多少方法被忽略掉了,同时会显示多少方法运行成功,以及多少方法运行失败。Note:@Ignore 有一个可选的参数,可以用它来简单的记录为什么这个方法被忽略掉了。
运行测试
在JUnit 3.8中你可以有多种运行方式:text, AWT或者Swing,但是在JUnit 4中仅使用text方式。