【问题标题】:KotlinTest`s BehaviorSpec "No runnable methods" with SpringJUnit4ClassRunnerKotlinTest 的 BehaviorSpec “没有可运行的方法”与 SpringJUnit4ClassRunner
【发布时间】:2017-10-29 05:19:55
【问题描述】:

我写了以下测试:

@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,这只是我为了隔离问题而写的一个简单示例

【问题讨论】:

  • 你可以试试SpringJUnit4ClassRunner::class.java而不是SpringJUnit4ClassRunner::class

标签: kotlin kotlintest


【解决方案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, ...
    }
}

【讨论】:

  • KotlinTest 测试的结构是这样设计的。
  • @Sam 我同意你的观点,但我认为我们需要一个自定义跑步者。目前,来自 Mibac 的答案是我们拥有的最佳选择。
【解决方案2】:

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

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

【讨论】:

  • 如果我使用 KTestJUnitRunner,spring 不要注入我的依赖项。
  • 您可以使用@SpringClassRule@SpringMethodRule 在不使用spring 测试运行器的情况下启用spring 测试上下文功能。
  • '@SpringMethodRule' 不能在 init 方法中定义。我找不到“@SpringClassRule”注释。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多