junit - JUnit 测试中的 kotlin 属性初始值设定项执行

标签 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 已关闭,因此会抛出异常。不过,代码运行没有问题。当我跟踪它时,我看到每个测试都运行了初始化 block 。换句话说,session 是为每个测试初始化​​的。

我的问题是为什么?这是 JUnit 背后的行为吗?对于每个测试,它将运行整个初始化程序以及类的构造函数?

如果是这样的话,为什么要使用@Before注释呢?难道我们不能将所有的@Before代码放在初始化 block 中

最佳答案

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

Can't we just put all the @Before code in the initializer block

是的,可以(在 Java 的构造函数中)。它更多的是与 @After 对称。

关于junit - JUnit 测试中的 kotlin 属性初始值设定项执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47405390/

相关文章:

java - 使用 JUnit 比较 ArrayList 是否相等的简单方法?

java - JUnit 测试 : Forcing exception from internal method call

Java JUnit 参数化错误

generics - 为什么我不能得到泛型参数的类?

constructor - Kotlin:不允许使用辅助构造函数参数上的 'val'

java - Java 和 Kotlin 泛型方法的区别

spring-mvc - RestAssuredMockMvc 连接到 http ://localhost:8080 refused

java - 为什么 assertEquals(new Object[] {"abc"}, new Object[] {"abc"});不失败?

kotlin - 在 Kotlin 中否定谓词的简单方法(例如 (String) -> Boolean))

kotlin - 进行注释处理时如何查看 "NOTE"级别诊断?