2

我写了以下测试:

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

我知道问题是我正在尝试使用带有 Spring 的 KotlinTest 编写测试,但我该怎么做呢?我应该使用什么跑步者?

示例测试不需要spring,这只是我为了隔离问题而写的一个简单示例

4

3 回答 3

1

您在构造函数中编写了测试。测试应该写在带有@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, ...
    }
}
于 2017-06-30T21:42:20.020 回答
0

您已指定@RunWith(SpringJUnit4ClassRunner::class). 这将覆盖 KotlinTest 运行器,即KTestJUnitRunner. 为了让您的 KotlinTest 测试被选中,您需要使用正确的测试运行器。

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

于 2017-06-30T21:46:54.820 回答
0

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

于 2017-10-28T19:02:46.313 回答