Поведение KotlinTest`sSpec «Никакие управляемые методы» с 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, но как я могу это сделать? Какой бегун я должен использовать?

Примерный тест не нужен весной, это был просто простой пример, который я написал, чтобы изолировать проблему

Вы написали свой тест в конструкторе. Тесты должны быть записаны в функции с аннотацией @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 как и предполагалось.

Мне кажется, что логика теста противоположна: first stack.isEmpty() shouldBe false second 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 } } 

Я знаю, что это не вопрос, который вы задаете, но ваша логика кажется противоположной. Я не могу исправить градиент и kotlintest.