У меня есть простой тест для тестирования класса в приложении 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