NoSuchMethodError 'void <init>()' при тестировании внедренного класса Kotlin с внедрением провайдера с использованием QuarkusTestExtension - PullRequest
0 голосов
/ 06 марта 2020

У меня есть простой тест для тестирования класса в приложении Quarkus (с использованием kotlin и gradle), который не выполняется при непосредственном введении тестируемого класса, но успешно выполняется при его создании.

странно то, что это происходит только в CI или при отладке в IDE (Intellij) - ни при выполнении его с помощью проверки ./gradlew, ни при запуске без отладки в IDE.

Сбои:

@QuarkusTest
class InfluxVehicleRepositoryTest
@Inject constructor(private val influxVehicleRepository: InfluxVehicleRepository) {
    @Test
    fun findByMinutesFromNow() {
        val result = influxVehicleRepository.findByMinutesFromNow(5)

        assertThat(result).isEmpty()
    }
}

Успешно:

@QuarkusTest
@QuarkusTestResource(InfluxDBResource::class)
class InfluxVehicleRepositoryTest
@Inject constructor(private val influxDBProvider: InfluxDBProvider) {
    @Test
    fun findByMinutesFromNow() {
        val influxVehicleRepository = InfluxVehicleRepository(influxDBProvider)
        val result = influxVehicleRepository.findByMinutesFromNow(5)

        assertThat(result).isEmpty()
    }
}

Тестируемый класс, а также его прямая зависимость выглядят так:

@ApplicationScoped
class InfluxVehicleRepository
private constructor(private val influxDB: InfluxDB) : VehicleRepository {
    @Inject
    constructor (influxDBProvider: InfluxDBProvider) : this(influxDBProvider.get())
    ...
}

...

@ApplicationScoped
class InfluxDBProvider : Provider<InfluxDB> {
    @ConfigProperty(name = "traffic.influx.username", defaultValue = "admin")
    lateinit var username: String
    ...

    override fun get(): InfluxDB {
        ...
        return influxDb
    }
}

Вот журнал Gradle выполнение теста:

Testing started at 13:11 ...
> Task :cleanTest
> Task :compileKotlin UP-TO-DATE
> Task :compileJava NO-SOURCE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :compileTestKotlin UP-TO-DATE
> Task :quarkusTestConfig
> Task :compileTestJava NO-SOURCE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7$1 (file:/home/chris/.gradle/caches/modules-2/files-2.1/org.codehaus.groovy/groovy/2.5.8/2f1e8ea55e625fe51e85ef35eb067f1d9c61772d/groovy-2.5.8.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v7.Java7$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Mar 06, 2020 1:11:02 PM org.testcontainers.dockerclient.DockerClientProviderStrategy lambda$getFirstValidStrategy$1
INFO: Loaded org.testcontainers.dockerclient.EnvironmentAndSystemPropertyClientProviderStrategy from ~/.testcontainers.properties, will try it first
Mar 06, 2020 1:11:03 PM org.testcontainers.dockerclient.EnvironmentAndSystemPropertyClientProviderStrategy test
INFO: Found docker client settings from environment
Mar 06, 2020 1:11:03 PM org.testcontainers.dockerclient.DockerClientProviderStrategy lambda$getFirstValidStrategy$2
INFO: Found Docker environment with Environment variables, system properties and defaults. Resolved dockerHost=unix:///var/run/docker.sock
Mar 06, 2020 1:11:03 PM org.testcontainers.DockerClientFactory client
INFO: Docker host IP address is localhost
Mar 06, 2020 1:11:03 PM org.testcontainers.DockerClientFactory client
INFO: Connected to docker: 
  Server Version: 19.03.6-ce
  API Version: 1.40
  Operating System: Manjaro Linux
  Total Memory: 11908 MB
Mar 06, 2020 1:11:04 PM org.testcontainers.DockerClientFactory client
INFO: Ryuk started - will monitor and terminate Testcontainers containers on JVM exit
        ℹ︎ Checking the system...
        ✔ Docker version should be at least 1.6.0
        ✔ Docker environment should have more than 2GB free disk space
Mar 06, 2020 1:11:04 PM org.testcontainers.containers.GenericContainer tryStart
INFO: Creating container for image: influxdb:1.4.3
Mar 06, 2020 1:11:04 PM org.testcontainers.containers.GenericContainer tryStart
INFO: Starting container with ID: 9b84011b121fd153d81299d6b25ad4c9cf000524fb37cd8e591fcf233123bb39
Mar 06, 2020 1:11:04 PM org.testcontainers.containers.GenericContainer tryStart
INFO: Container influxdb:1.4.3 is starting: 9b84011b121fd153d81299d6b25ad4c9cf000524fb37cd8e591fcf233123bb39
Mar 06, 2020 1:11:04 PM org.testcontainers.containers.wait.strategy.HttpWaitStrategy waitUntilReady
INFO: /sharp_dirac: Waiting for 30 seconds for URL: http://localhost:32830/ping
Mar 06, 2020 1:11:08 PM org.testcontainers.containers.GenericContainer tryStart
INFO: Container influxdb:1.4.3 started in PT5.352938S
Mar 06, 2020 1:11:08 PM org.jboss.threads.Version <clinit>
INFO: JBoss Threads version 3.0.0.Final
[0K[1mde.flick.traffic.vehicles.InfluxVehicleRepositoryTest[m
[0K[1m  Test [22mfindByMinutesFromNow()[31m FAILED[31m
  org.junit.jupiter.api.extension.TestInstantiationException: TestInstanceFactory [io.quarkus.test.junit.QuarkusTestExtension] failed to instantiate test class [de.flick.traffic.vehicles.InfluxVehicleRepositoryTest]
  Caused by: java.lang.ExceptionInInitializerError
  Caused by: java.lang.RuntimeException: Failed to start quarkus
  Caused by: java.lang.RuntimeException: Failed to initialize Arc
  Caused by: java.lang.NoSuchMethodError: de.flick.traffic.vehicles.InfluxVehicleRepository: method 'void <init>()' not found
[m

TestInstanceFactory [io.quarkus.test.junit.QuarkusTestExtension] failed to instantiate test class [de.flick.traffic.vehicles.InfluxVehicleRepositoryTest]
org.junit.jupiter.api.extension.TestInstantiationException: TestInstanceFactory [io.quarkus.test.junit.QuarkusTestExtension] failed to instantiate test class [de.flick.traffic.vehicles.InfluxVehicleRepositoryTest]
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstanceFactory(ClassBasedTestDescriptor.java:300)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateTestClass(ClassBasedTestDescriptor.java:275)
    at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.instantiateTestClass(ClassTestDescriptor.java:77)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:258)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:252)
    at java.base/java.util.Optional.orElseGet(Optional.java:362)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:251)
    at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:29)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:106)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:105)
    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:107)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:107)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:75)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
    at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
    at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
    at com.sun.proxy.$Proxy2.stop(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.ExceptionInInitializerError
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:416)
    at io.quarkus.runner.RuntimeRunner.run(RuntimeRunner.java:153)
    at io.quarkus.test.junit.QuarkusTestExtension.doJavaStart(QuarkusTestExtension.java:249)
    at io.quarkus.test.junit.QuarkusTestExtension.createTestInstance(QuarkusTestExtension.java:394)
    at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstanceFactory(ClassBasedTestDescriptor.java:285)
    ... 72 more
Caused by: java.lang.RuntimeException: Failed to start quarkus
    at io.quarkus.runner.ApplicationImpl.<clinit>(ApplicationImpl.zig:406)
    ... 78 more
Caused by: java.lang.RuntimeException: Failed to initialize Arc
    at io.quarkus.arc.Arc.initialize(Arc.java:26)
    at io.quarkus.arc.runtime.ArcRecorder.getContainer(ArcRecorder.java:34)
    at io.quarkus.deployment.steps.ArcProcessor$generateResources26.deploy_0(ArcProcessor$generateResources26.zig:72)
    at io.quarkus.deployment.steps.ArcProcessor$generateResources26.deploy(ArcProcessor$generateResources26.zig:36)
    at io.quarkus.runner.ApplicationImpl.<clinit>(ApplicationImpl.zig:360)
    ... 78 more
Caused by: java.lang.NoSuchMethodError: de.flick.traffic.vehicles.InfluxVehicleRepository: method 'void <init>()' not found
    at de.flick.traffic.vehicles.InfluxVehicleRepository_ClientProxy.<init>(InfluxVehicleRepository_ClientProxy.zig:129)
    at de.flick.traffic.vehicles.InfluxVehicleRepository_Bean.<init>(InfluxVehicleRepository_Bean.zig:218)
    at io.quarkus.arc.setup.Default_ComponentsProvider.addBeans1(Default_ComponentsProvider.zig:1074)
    at io.quarkus.arc.setup.Default_ComponentsProvider.getComponents(Default_ComponentsProvider.zig:38)
    at io.quarkus.arc.impl.ArcContainerImpl.<init>(ArcContainerImpl.java:103)
    at io.quarkus.arc.Arc.initialize(Arc.java:20)
    ... 82 more

[0K[1;31mFAILURE: [39mExecuted 1 tests in 8.7s (1 failed)[m
1 test completed, 1 failed
> Task :test FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':test'.
> There were failing tests. See the report at: file:///home/chris/dev/ConnectedVehicle/project/cvs/manage-vehicle-data/build/reports/tests/test/index.html
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 9s
6 actionable tasks: 3 executed, 3 up-to-date

Итак, мои вопросы: почему первая версия дает сбой (не во всех случаях), а вторая - нет?

Настройка:

  • Gradle: 6.0.1
  • Quarkus: 1.2.1.Final
  • JDK: OpenJDK 13
  • sourceCompatibility: JavaVersion.VERSION_1_8
  • targetCompatibility: JavaVersion. VERSION_1_8
  • ОС: Manjaro Linux

1 Ответ

0 голосов
/ 12 марта 2020

Очевидно, что это была ошибка в загрузчике классов Quarkus, которая будет исправлена ​​в следующем выпуске Quarkus 1.3.0.

Для получения дополнительной информации см. Связанную проблему GitHub: https://github.com/quarkusio/quarkus/issues/7710

...