作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试写 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定义 beforeTest
、afterTest
、beforeSpec
等。
在这种情况下,可能的解决方案应该是:
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
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/
我是一名优秀的程序员,十分优秀!