I am trying to use micronaut from Kotlin. I have this:
package me.test
import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Produces
@Controller("/hello")
class Controller() {
@Get("/")
@Produces(MediaType.TEXT_PLAIN)
fun ping(): String {
return "hello world"
}
}
package me.test
import io.micronaut.runtime.Micronaut
object Application {
@JvmStatic
fun main(args: Array<String>) {
Micronaut.build()
.packages("me.test")
.mainClass(Application.javaClass)
.start()
}
}
I wrote the following controller test:
package me.test
import io.micronaut.http.client.RxHttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.test.annotation.MicronautTest
import org.junit.jupiter.api.Test
import javax.inject.Inject
@MicronautTest(application = Application::class)
class ControllerTest {
@Inject
@field:Client("/")
private lateinit var client: RxHttpClient
@Test
fun `should server ping with a pong`() {
val result = client.toBlocking().retrieve("/hello")
println(result)
}
}
but the test fails with a HttpClientResponseException: Page Not Found
.
I have debugged this and from what I can tell, during the test, in DefaultBeanContext.getBeanDefinitions
it doesn't find any beans for the @Controller
qualifier. When I start the application using my Application
class, I can see that it finds the Controller
and makes the route available.
This is pretty much the Hello World for Micronaut, I am not sure what's going wrong here.
I think this is purely IDE related. I have Intellij set up to use Annotation Processors, to delegate builds to Gradle and to use the Gradle Test Runner. However, you also need to delete any existing test configurations and then the problem goes away.