KotlinTest's BehaviorSpec“;“没有可运行的方法”;用SpringJunitClassRunner
我编写了以下测试:KotlinTest's BehaviorSpec“;“没有可运行的方法”;用SpringJunitClassRunner,kotlin,kotlintest,Kotlin,Kotlintest,我编写了以下测试: @RunWith(SpringJUnit4ClassRunner::class) class KotlinTest : BehaviorSpec() { init { given("a stack") { val stack = Stack<String>() `when`("an item is pushed") { stack.push("kotlin")
@RunWith(SpringJUnit4ClassRunner::class)
class KotlinTest : BehaviorSpec() {
init {
given("a stack") {
val stack = Stack<String>()
`when`("an item is pushed") {
stack.push("kotlin")
then("the stack should not be empty") {
stack.isEmpty() shouldBe true
}
}
`when`("the stack is popped") {
stack.pop()
then("it should be empty") {
stack.isEmpty() shouldBe false
}
}
}
}
}
@RunWith(SpringJUnit4ClassRunner::class)
类KotlinTest:BehaviorSpec(){
初始化{
给定(“一堆”){
val stack=stack()
`当“(“推送项”){
堆栈推送(“kotlin”)
然后(“堆栈不应为空”){
stack.isEmpty()应为true
}
}
`当“(“堆栈被弹出”){
stack.pop()
然后(“它应该是空的”){
stack.isEmpty()应为false
}
}
}
}
}
当我尝试运行它时,出现以下错误:
java.lang.Exception: No runnable methods
at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)
at org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128)
at org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:84)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:65)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:138)
java.lang.Exception:没有可运行的方法
位于org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)
位于org.junit.runners.BlockJUnit4ClassRunner.collectInitializationErrors(BlockJUnit4ClassRunner.java:128)
位于org.junit.runners.ParentRunner.validate(ParentRunner.java:416)
在org.junit.runners.ParentRunner上(ParentRunner.java:84)
位于org.junit.runners.BlockJUnit4ClassRunner。(BlockJUnit4ClassRunner.java:65)
位于org.springframework.test.context.junit4.SpringJUnit4ClassRunner。(SpringJUnit4ClassRunner.java:138)
我知道问题是我正在尝试运行一个用KotlinTest和Spring编写的测试,但是我该怎么做呢?我应该用什么跑步器
示例测试不需要spring,这只是一个简单的示例,我编写它是为了隔离问题您在构造函数中编写了测试。测试应该在带有
@Test
注释的函数中编写。您的代码与其说是等价的,不如说是:
@RunWith(SpringJUnit4ClassRunner.class)
public final class JavaTest extends BehaviorSpec {
public JavaTest() {
// given stack, when item is pushed, ...
}
}
你想要的是
@RunWith(SpringJUnit4ClassRunner.class)
public final class JavaTest extends BehaviorSpec {
@Test
public void testName() {
// given stack, when item is pushed, ...
}
}
要实现这一点,您需要使用fun
关键字来定义函数。结果应该看起来不像这样:
@RunWith(SpringJUnit4ClassRunner::class)
class KotlinTest : BehaviorSpec() {
@Test fun testName() {
given stack, when item is pushed, ...
}
}
您已经指定了
@RunWith(SpringJUnit4ClassRunner::class)
。这将覆盖KotlinTest runner,即KTestJUnitRunner
。为了获取KotlinTest测试,您需要使用正确的测试运行程序
删除
RunWith
注释可以解决此问题。然后,测试运行程序将按照预期从BehaviorSpec超类继承。在我看来,测试的逻辑应该是相反的:
第一个stack.isEmpty()应该为false
第二个stack.isEmpty()应该为true
当我使用gradle(不使用@RunWith)和kotlintest I运行测试时
无法以任何方式修复此问题:nosense java.util.EmptyStackException
和java.lang.AssertionError
When("an item is pushed") {
stack.push("kotlin")
Then("the stack should not be empty") {
stack.isEmpty() shouldBe false
//stack.empty() shouldBe false
//stack.size shouldBe gt(0)
}
}
When("the stack is popped") {
stack.pop()
Then("it should be empty") {
stack.isEmpty() shouldBe true
}
}
我知道这不是你问的问题,但你的逻辑似乎颠倒了。
我无法解决gradle和kotlintest的问题。你能试试
SpringJUnit4ClassRunner::class.java
而不是SpringJUnit4ClassRunner::class
kotlintest测试是这样设计的。@Sam我同意你的观点,但我认为我们需要一个自定义的运行程序。目前,来自Mibac的答案是我们最好的选择。如果我使用KTestJUnitRunner,spring不会注入我的依赖项。您可以使用@SpringClassRule
和@SpringMethodRule
启用spring测试上下文功能,而不使用spring测试运行程序。无法在init方法中定义“@SpringMethodRule”。我找不到“@SpringClassRule”批注。