KotlinTest 的 BehaviorSpec "No runnable methods" 与 SpringJUnit4ClassRunner

KotlinTest`s BehaviorSpec "No runnable methods" with SpringJUnit4ClassRunner

我写了下面的测试:

@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
                }
            }
        }
    }
}

当我尝试 运行 它时,出现以下错误:

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)

我知道问题是我正在尝试 运行 使用 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)。这将覆盖 KTestJUnitRunner 的 KotlinTest 运行器。为了提取您的 KotlinTest 测试,您需要使用正确的测试运行器。

删除您的 RunWith 注释应该可以解决问题。然后测试运行器将按预期从 BehaviorSpec 超类继承。

在我看来,测试的逻辑应该是相反的: 第一 stack.isEmpty() shouldBe false 第二 stack.isEmpty() shouldBe true 当我 运行 使用 gradle (并且没有 @RunWith)使用 kotlintest 进行测试时,我 无法以任何方式解决问题:nosense java.util.EmptyStackExceptionjava.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 修复。