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.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 修复。
我写了下面的测试:
@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.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 修复。