Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
KotlinTest's BehaviorSpec“;“没有可运行的方法”;用SpringJunitClassRunner_Kotlin_Kotlintest - Fatal编程技术网

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”批注。