英文:
Testing with Java 12 and Gradle does not work
问题
我正在尝试使用 testfx、junit 和 powermock 来为我的 JavaFX 应用程序编写一些测试。当我从我的 IntelliJ IDEA IDE 中运行这些测试时,它们可以正常工作。但是,当我通过 Gradle 脚本的 'test' 任务运行它们时,我遇到了以下异常:
无法转换名称为 core.ui.TestBrowseDirUI 的类。原因:core.ui.TestBrowseDirUI
java.lang.IllegalStateException: 无法转换名称为 core.ui.TestBrowseDirUI 的类。原因:core.ui.TestBrowseDirUI
...
核心的问题是 core.ui.TestBrowseDirUI 与被测试的类位于相同的包中(分割包)。从命令行中我可以看到,Gradle 已经应用了 --patch-module 以及所有需要的命令行选项。
英文:
I'm trying to use testfx, junit and powermock to impl. some tests for my javafx application. When I run the tests from my intellij ide, they work nicely. Running them over the 'test' task of my gradle script. I get following exception:
Failed to transform class with name core.ui.TestBrowseDirUI. Reason: core.ui.TestBrowseDirUI
java.lang.IllegalStateException: Failed to transform class with name core.ui.TestBrowseDirUI. Reason: core.ui.TestBrowseDirUI
at powermock.core@2.0.7/org.powermock.core.classloader.javassist.JavassistMockClassLoader.defineAndTransformClass(JavassistMockClassLoader.java:119)
at powermock.core@2.0.7/org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:174)
at powermock.core@2.0.7/org.powermock.core.classloader.MockClassLoader.loadClassByThisClassLoader(MockClassLoader.java:102)
at powermock.core@2.0.7/org.powermock.core.classloader.DeferSupportingClassLoader.loadClass1(DeferSupportingClassLoader.java:147)
at powermock.core@2.0.7/org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:98)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:415)
at powermock.module.junit4.common@2.0.7/org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:154)
at powermock.module.junit4.common@2.0.7/org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:47)
at powermock.core@2.0.7/org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:107)
at powermock.module.junit4.common@2.0.7/org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:69)
at powermock.module.junit4.common@2.0.7/org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:36)
at powermock.module.junit4@2.0.7/org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at junit@4.13/org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at junit@4.13/org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at junit@4.13/org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at junit@4.13/org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37)
at junit@4.13/org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70)
at junit@4.13/org.junit.internal.requests.ClassRequest.createRunner(ClassRequest.java:28)
at junit@4.13/org.junit.internal.requests.MemoizingRequest.getRunner(MemoizingRequest.java:19)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:78)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
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:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:117)
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:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
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:55)
at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: javassist.NotFoundException: core.ui.TestBrowseDirUI
at javassist@3.27.0-GA/javassist.ClassPool.get(ClassPool.java:430)
at powermock.core@2.0.7/org.powermock.core.classloader.javassist.JavassistMockClassLoader.defineAndTransformClass(JavassistMockClassLoader.java:98)
... 55 more
The core.ui.TestBrowseDirUI is in the same package (split package) as the class under test. From the command line I saw, that gradle already applies --patch-module and all needed command line options.
答案1
得分: 0
已解决问题!
我将项目重新配置为多模块 Gradle 项目,其中一个模块是测试模块,另一个是应用模块。一旦我建立了这个结构,一切都开始正常工作起来。
英文:
Solved the problem!
I reconfigured my project to a multi-module gradle project where one module is the test module and the other is the app module. Once I had this structure in place everything started to work nicely.
专注分享java语言的经验与见解,让所有开发者获益!
评论