Test - @Test注解与继承TestCase混用问题及原因


前言
在作单元测试的时候,可能使用@Test注解执行一个测试用例,或者测试类继承junit.framework.TestCase,方法名为test前缀执行测试用例,如下:

1. 使用@Test注解

public class Junit4Test {

@Test
public void testX() {
Assert.assertEquals(0, 0);
}
}
2. 继承TestCase

public class Junit3Test extends TestCase {

public void testX() {
assertEquals(0, 0);
}
}
@Test注解与TestCase的区别

继承TestCase:Junit3的方式,方法名以test为前缀

@Test注解:Junit4的方式,方法上使用注解@Test

p.s. :Junit4为了兼容性,jar包里打包的有Junit3的代码

混合使用及可能问题和原因
示例代码如下:

public class JunitTest extends TestCase {

@Test
public void testX() {
assertEquals(0, 0);
}
}
有一些不清楚的同学刚用的时候,可能会这样使用(如不清楚原理,代码模仿等),优点也有,比如使用断言方法不用静态的导入org.junit.Assert类,因为直接继承了TestCase类。

使用错觉:执行的时候可能认为是@Test注解的原因支持测试用例的执行。

实际上在我本地测试的时候,这种方式都是以Junit3的方式运行,比如再定义个方法,方法名不以test开头:

public class JunitTest extends TestCase {

@Test
public void testX() {
assertEquals(0, 0);
}
@Test
public void xx() {
assertEquals(0, 0);
}
}
方法xx无法作为测试用例执行的,即使使用了注解@Test,但不符合Junit3的使用规范,所以@Test注解实际是不生效的。

当然,很多时候即使新手,也可能都会遵守以test作为前缀的方法命名,一般不会发现这个问题。

但是在使用Junit4的一些能力的时候,会发现结果不预期,比如使用@Before、@BeforeClass等注解不生效。注意这些是属于Junit4的。按照Junit3的方式当然会不支持(包括@Test注解的异常测试等能力)。

所以,如果出现Junit4的注解不生效的时候,可以检查是否因为继承TestCase而使用了Junit3方式测试的原因导致。

如果还想使用Junit4的能力,依然继承TestCase类的时候(可能如文中说的,可能继承它的一些断言方法)或者是其它外力原因不可更改,可以在测试类上加上注解@RunWith(JUnit4.class)显式指定使用Junit4。如下:

@RunWith(JUnit4.class)
public class JunitTest extends TestCase {

@Test
public void testX() {
assertEquals(0, 0);
}
@Test
public void xx() {
assertEquals(0, 0);
}
}
这样就可以按预期的使用Junit4的能力执行测试用例。
————————————————
版权声明:本文为CSDN博主「不识君的荒漠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/x763795151/article/details/89218868