我有一个用于在Kotlin中进行测试的抽象基类:
abstract class TestBase(){
protected var session = configure()
private fun configure() {
...
return session // a live session object
}
@After
open fun tearDown() {
...
session.close()
}
}
然后在派生的测试类中,我们有
class MyTest: TestBase() {
...
@Test
fun testScenario1() {
... // uses the live session object
assertTrue(myCondition_1)
}
@Test
fun testScenario2() {
... // uses the live session object
assertTrue(myCondition_2)
}
}
当我第一次看到这段代码时,我认为这会有问题,因为如果session
只在初始化部分执行一次,它将在第一次测试运行后关闭。在第二次测试期间,由于session
已关闭,因此会抛出异常。但是,代码运行没有问题。当我跟踪它时,我看到每个测试都运行了初始化块。换句话说,session
已针对每个测试进行初始化。
我的问题是为什么?这是JUnit背后的行为,对于每个测试,它将运行整个初始化程序加上类的构造函数吗?
如果是这种情况,为什么要使用@Before
注释?我们不能将所有@Before
代码放在初始化程序块
答案 0 :(得分:2)
是的,JUnit为每个测试创建一个新的类实例。在构造函数之后调用@Before
方法。
我们不能只将所有@Before代码放在初始化程序块
中
是的,你可以(在Java的构造函数中)。它更适用于@After
的对称性。