Junit是否在每次测试方法调用时重新初始化该类?
当我运行以下代码时,两个测试用例都成为现实:
import static junit.framework.Assert.assertEquals; import org.junit.Test; public class MyTest{ private int count; @Before public void before(){ count=1; } @Test public void test1(){ count++; assertEquals(2, count); } @Test public void test2(){ count++; assertEquals(2, count); } }
预期的行为
- test1 – 成功
- test2 – 失败(正如预期的那样,计数将变为3)
实际行为
- test1 – 成功
- test2 – 成功
为什么junit会在每次测试方法调用时reinitializing class/variable
。 这是junit中的错误或故意提供。
每种测试方法的MyTest
新实例
对于每个测试方法,将创建一个新的MyTest
实例 ,这是Junit的行为。
因此,对于这两种方法,变量count
值为1
,因此对于两种测试方法, count++
的值都是2
,因此测试用例通过。
public class MyTest{ public MyTest(){ // called n times System.out.println("Constructor called for MyTest"); } @Before //called n times public void setUp(){ System.out.println("Before called for MyTest"); } //n test methods }
如果您使用2种测试方法执行上述代码:
输出将是:
Constructor called for MyTest Before called for MyTest //test execution Constructor called for MyTest Before called for MyTest
这是因为测试隔离。
没有测试应该依赖于另一个。
查看org.junit.runner.Runner
的文档:
默认的运行程序实现保证在运行测试之前立即构造测试用例类的实例,并且运行器将不保留对测试用例实例的引用,通常使它们可用于垃圾回收。
unit testing应该是独立的,否则它将变得不可用。 请注意,不保证执行方法的顺序(除非使用注释@FixMethodOrder
)。
除非它是不可变的,否则不要在构造函数中初始化测试类状态。
JUnit不会为每个@Test
实例化您的测试类。 实际上@Before
在每个方法之前运行标记为@Before
方法,并且在类中的所有测试之前运行@BeforeClass
方法一次。
但是,您不能保证测试运行器实际上只使用您的测试类的一个实例来运行测试。 它可以免费使用 – 考虑并行运行一系列测试,即使在不同的机器上也是如此。
虽然有一般的JUnit运行器设置来控制它,但是只需遵循JUnit设计并在仅标记为@Before
的方法中初始化测试状态@Before
了。
如果要对所有测试使用测试类的成员变量,而不将其重新初始化为null,则将其设置为静态 。