Как использовать TestPropertyProvider и внедрить RxHttpClient с Micronaut, используя Kotlin - PullRequest
0 голосов
/ 15 января 2020

Примечание - я парень из Java + Spring, пробующий Kotlin + Micronaut.

Я пытаюсь использовать TestPropertyProvider для установки свойств после запуска моей встроенной службы.
Работает нормально, пока в моем тестовом классе нет параметров конструктора.

Я могу добавить RxHttpClient в качестве параметра конструктора, и он будет вставлен нормально.

Но я хотел бы добавить RxHttpClient от Micronaut и также реализовать TestPropertyProvider.
Я попытался добавить @Inject к RxHttpClient, но получил ошибку This annotation is not applicable to target 'local variable' [потому что тело теста - лямбда, переданная суперклассу]

Без @Inject я получаю ошибку lateinit property client has not been initialized

В моем базовом классе есть реализация TestPropertyProvider.

abstract class ZeebeSpecification(body: AbstractStringSpec.() -> Unit): StringSpec(body), TestPropertyProvider {
    override fun getProperties(): MutableMap<String, String> {
        return mutableMapOf("orchestrator.management.client.brokerContactPoint" to IntegrationTestHarness.instance.getBroker())
    }
}

TestPropertyProvider работает, но RxHttpClient не вводится

@MicronautTest
class ZeebeBroker1Test() : ZeebeSpecification({

    @Client("/") lateinit var client: RxHttpClient;

    ...tests

}) {}

RxHttpClient вводится, но TestPropertyProvider не оценивается

@MicronautTest
class ZeebeBroker1Test(@Client("/" val client: RxHttpClient) : ZeebeSpecification({


    ...tests

}) {}

Я удалил базовый класс из уравнения и заставил свой тест напрямую реализовать TestPropertyProvider, но он все равно не прошел.

@MicronautTest
class ZeebeBroker1Test(@Client("/") var client: HttpClient) : BehaviorSpec(), TestPropertyProvider {

    init {
        ...tests
    }
    private fun getBroker(): String {
        return IntegrationTestHarness.instance.getBroker()
    }
    override fun getProperties(): MutableMap<String, String> {
        return mutableMapOf("orchestrator.management.client.brokerContactPoint" to getBroker())
    }
}

Похоже, это такая же проблема, как эта, но я уже использую v1.1.2
https://github.com/micronaut-projects/micronaut-test/issues/82

Если я попытался использовать @Inject @Client("/") client: RxHttpClient будет выдано сообщение об ошибке message: Missing bean argument [LoadBalancer loadBalancer] for type: io.micronaut.http.client.DefaultHttpClient. Required arguments: LoadBalancer

Как использовать TestPropertyProvider и вводимый RxHttpClient?

1 Ответ

0 голосов
/ 15 января 2020

Я решил проблему, переместив тело spe c в init и введя RxHttpClient в качестве поля.

@MicronautTest
class ZeebeBroker1Test() : ZeebeSpecification() {

    @Inject @field:Client("/") lateinit var client: RxHttpClient

    private val log: Logger = LoggerFactory.getLogger(ZeebeBroker1Test::class.java)

    init {
        "test case 1" {
            ...
        }

        "test case 2" {
            ...
        }
    }
}

И я позволил базовому классу реализовать интерфейс TestPropertyProvider.

abstract class ZeebeSpecification(): StringSpec(), TestPropertyProvider {

    open fun getBroker(): String {
        return IntegrationTestHarness.instance.getBroker()
    }

    override fun getProperties(): MutableMap<String, String> {
        return mutableMapOf("orchestrator.management.client.brokerContactPoint" to getBroker())
    }
}
...