KotlinTest`s BehaviorSpec "No hay methods ejecutables" con SpringJUnit4ClassRunner

Escribí la siguiente testing:

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

Cuando bash ejecutarlo, tengo el siguiente error:

 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) 

Sé que el problema es que estoy tratando de ejecutar una testing escrita con KotlinTest con Spring, pero ¿cómo puedo hacerlo? ¿Qué cornetworkingor debería usar?

La testing de ejemplo no necesita spring, esto fue solo un ejemplo simple que escribí para aislar el problema

Usted escribió su testing en el constructor. Las testings deben escribirse en funciones con la anotación @Test . Su código es más y less el equivalente de:

 @RunWith(SpringJUnit4ClassRunner.class) public final class JavaTest extends BehaviorSpec { public JavaTest() { // given stack, when item is pushed, ... } } 

Lo que quieres en cambio es

 @RunWith(SpringJUnit4ClassRunner.class) public final class JavaTest extends BehaviorSpec { @Test public void testName() { // given stack, when item is pushed, ... } } 

Para lograr esto, necesita utilizar palabras key fun para definir una function. El resultado debería verse más o less así:

 @RunWith(SpringJUnit4ClassRunner::class) class KotlinTest : BehaviorSpec() { @Test fun testName() { given stack, when item is pushed, ... } } 

Has especificado @RunWith(SpringJUnit4ClassRunner::class) . Eso está anulando al cornetworkingor KotlinTest, que es KTestJUnitRunner . Para que se recojan sus testings de KotlinTest, debe usar el corrector de testing correcto.

La eliminación de su anotación RunWith debería solucionar el problema. A continuación, el cornetworkingor de testing se henetworkingará de la superclass BehaviorSpec según lo previsto.

Me parece que la lógica de la testing es lo opuesto a lo que debería ser: first stack.isEmpty() shouldBe false second stack.isEmpty() shouldBe true Cuando ejecuto la testing con gradle (y sin @RunWith) con kotlintest no puedo soluciona el problema de cualquier forma: nosense java.util.EmptyStackException y 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 } } 

Sé que esta no es la pregunta que hace, pero su lógica parece revertida. No puedo arreglarlo con gradle y kotlintest.