我有一个用于在 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/