JUnit测试中的kotlin属性初始化程序执行

时间:2017-11-21 04:45:50

标签: junit kotlin

我有一个用于在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代码放在初始化程序块

1 个答案:

答案 0 :(得分:2)

是的,JUnit为每个测试创建一个新的类实例。在构造函数之后调用@Before方法。

  

我们不能只将所有@Before代码放在初始化程序块

是的,你可以(在Java的构造函数中)。它更适用于@After的对称性。