gpt4 book ai didi

Kotlin 测试,如何使用DescribeSpec 测试风格运行BeforeEach

转载 作者:行者123 更新时间:2023-12-02 05:32:12 26 4
gpt4 key购买 nike

我正在尝试写 KotlinTest在 JUnit5 上运行的测试,带有 Describe Spec style .

当我需要为某些测试初始化​​相同的变量时,@BeforeEach 在DescribeSpec 中不起作用。

如何在每次测试前初始化数据?

class BlockchainUT : DescribeSpec({

var blockchain = Blockchain()

@BeforeEach
fun beforeEach() {
blockchain = Blockchain()
blockchain.addBlock(listOf("foo1", "bar1"))
blockchain.addBlock(listOf("foo2", "bar2"))
blockchain.addBlock(listOf("foo3", "bar3"))
}

describe("isValidChain()") {

context("when the chain does not start with the genesis block") {

blockchain.chain[0] = Block(
System.currentTimeMillis(),
"---",
"xxx",
listOf("foo", "bar"))

it("returns false") {
Blockchain.isValid(blockchain) shouldBe false
}
}

context("when the chain starts with the genesis block and has multiple blocks") {

context("and a lastHash reference has changed returns false") {
blockchain.chain[2] = Block(
blockchain.chain[2].timestamp,
"broken-lastHash",
blockchain.chain[2].hash,
blockchain.chain[2].data)
it("returns false") {
Blockchain.isValid(blockchain) shouldBe false
}
}

context("and the chain contains a block with an invalid field") {
blockchain.chain[2] = Block(
blockchain.chain[2].timestamp,
blockchain.chain[2].lastHash,
blockchain.chain[2].hash,
listOf("some-bad-and-evil-data"))
it("returns false") {
Blockchain.isValid(blockchain) shouldBe false
}
}
}

}
})

最佳答案

在新版本的 KotlinTest 3.3 上有新的 Listeners定义 beforeTestafterTestbeforeSpec 等。

在这种情况下,可能的解决方案应该是:

class BlockchainUT : DescribeSpec(), TestListener {

var blockchain = Blockchain()

override fun beforeTest(describe: TestCase): Unit {
blockchain = Blockchain()
blockchain.addBlock(listOf("foo1", "bar1"))
blockchain.addBlock(listOf("foo2", "bar2"))
blockchain.addBlock(listOf("foo3", "bar3"))
}

init {
describe("isValidChain()") {

context("when the chain starts with the genesis block and has multiple blocks") {

context("and a lastHash reference has changed returns false") {

blockchain.chain[2] = Block(
blockchain.chain[2].timestamp,
"broken-lastHash",
blockchain.chain[2].hash,
blockchain.chain[2].data)

it("returns false") {
Blockchain.isValid(blockchain) shouldBe false
}
}

context("and the chain contains a block with an invalid field") {

blockchain.chain[2] = Block(
blockchain.chain[2].timestamp,
blockchain.chain[2].lastHash,
blockchain.chain[2].hash,
listOf("some-bad-and-evil-data"))

it("returns false") {
Blockchain.isValid(blockchain) shouldBe false
}
}

context("and the chain does not contain any invalid blocks") {

it("returns true") {
Blockchain.isValid(blockchain) shouldBe true
}
}
}
}
}
}

也可以使用新的 Isolation Modes 来解决,将隔离模式定义为InstancePerLeaf。来自 io.kotlintest.IsolationMode javadoc:

A new instance of the [Spec] class is instantiated for every
[TestCase] - both containers and leaf tests - and they are
executed once the previous test has completed.
For example, in the following test plan:
"this test" {
println("a")
"nested test" {
println("b")
}
"nested test 2" {
println("c")
}
}
The output will be:
a
a
b
a
c

  • 最后移动您想要为每个 [TestCase] 重复的代码
  • class BlockchainUT : DescribeSpec(){

    override fun isolationMode() = IsolationMode.InstancePerTest

    describe("isValidChain()") {

    context("when the chain starts with the genesis block and has multiple blocks") {

    var blockchain = Blockchain()
    blockchain.addBlock(listOf("foo1", "bar1"))
    blockchain.addBlock(listOf("foo2", "bar2"))
    blockchain.addBlock(listOf("foo3", "bar3"))

    context("and a lastHash reference has changed returns false") {

    blockchain.chain[2] = Block(
    blockchain.chain[2].timestamp,
    "broken-lastHash",
    blockchain.chain[2].hash,
    blockchain.chain[2].data)

    it("returns false") {
    Blockchain.isValid(blockchain) shouldBe false
    }
    }

    context("and the chain contains a block with an invalid field") {

    blockchain.chain[2] = Block(
    blockchain.chain[2].timestamp,
    blockchain.chain[2].lastHash,
    blockchain.chain[2].hash,
    listOf("some-bad-and-evil-data"))

    it("returns false") {
    Blockchain.isValid(blockchain) shouldBe false
    }
    }

    context("and the chain does not contain any invalid blocks") {

    it("returns true") {
    Blockchain.isValid(blockchain) shouldBe true
    }
    }
    }
    }
    }
    }

    关于Kotlin 测试,如何使用DescribeSpec 测试风格运行BeforeEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56518257/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com