使用SpringJUnit4ClassRunner的KotlinTest的BehaviorSpec“No runnable methods”

我写了下面的测试:

@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编写的测试,但我该怎么做呢? 我应该使用什么跑步者?

示例测试不需要弹簧,这只是我写的一个简单的例子来隔离问题

你在构造函数中写了你的测试。 测试应该用@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亚军,这是KTestJUnitRunner 。 为了让您的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修复。