setUp()和setUpBeforeClass()之间的区别

当使用JUnit进行unit testing时,有两个类似的方法setUp()setUpBeforeClass() 。 这些方法有什么区别? 另外, tearDown()tearDownAfterClass()之间有什么区别?

这里是签名:

 @BeforeClass public static void setUpBeforeClass() throws Exception { } @AfterClass public static void tearDownAfterClass() throws Exception { } @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } 

@BeforeClass@AfterClass注释的方法将在testing运行期间运行一次 – 在整个testing的开始和结束时,在其他任何运行之前运行。 实际上,它们是在testing类被构build之前运行的,这就是为什么它们必须被声明为static

@Before@After方法将在每个testing用例之前和之后运行,因此在testing运行期间可能会运行多次。

所以我们假设你在你的类中有三个testing,方法调用的顺序是:

 setUpBeforeClass() (Test class first instance constructed and the following methods called on it) setUp() test1() tearDown() (Test class second instance constructed and the following methods called on it) setUp() test2() tearDown() (Test class third instance constructed and the following methods called on it) setUp() test3() tearDown() tearDownAfterClass() 

把“BeforeClass”看作你的testing用例的一个静态初始化器 – 用它来初始化静态数据 – 在你的testing用例中不会改变的东西。 你一定要小心不是线程安全的静态资源。

最后,使用“AfterClass”注释方法来清除“BeforeClass”注释方法中所做的任何设置(除非它们的自我毁坏足够好)。

“之前”和“之后”是针对unit testing的具体初始化。 我通常使用这些方法来初始化/重新初始化我的依赖关系的模拟。 显然,这个初始化不是特定于unit testing,而是一般的unit testing。

setUpBeforeClass在构造函数之后的任何方法执行之前运行(仅运行一次)

setUp在每个方法执行之前运行

tearDown在每个方法执行后运行

tearDownAfterClass在所有其他方法执行后运行,是要执行的最后一个方法。 (只运行一次解构器)

从Javadoc :

有时候几个testing需要共享昂贵的计算机设置(如login数据库)。 虽然这可能会影响testing的独立性,但有时这是一个必要的优化。 使用@BeforeClass注释public static void no-arg方法会导致它在类中的任何testing方法之前运行一次。 超类的@BeforeClass方法将在当前类的前面运行。