Ser*_*rol 10 java testng gradle java-9
我正在尝试将以下库转换为Java 9模块:https://github.com/sskorol/test-data-supplier
遵循本指南:https://guides.gradle.org/building-java-9-modules
经过一些操作和重构(无法管理lombok问题,所以只是临时删除它),我有以下module-info.java:
module io.github.sskorol {
exports io.github.sskorol.core;
exports io.github.sskorol.model;
requires testng;
requires vavr;
requires streamex;
requires joor;
requires aspectjrt;
}
Run Code Online (Sandbox Code Playgroud)
它甚至可以在测试跳过的情况下进行编译/构建.但是,当我尝试运行测试任务时,我收到以下异常:
org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not complete execution for Gradle Test Executor 2.
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63)
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:564)
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.$Proxy1.stop(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:120)
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:564)
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:146)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:128)
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:1167)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: org.testng.TestNGException:
Cannot instantiate class io.github.sskorol.testcases.DataSupplierTests
at testng@6.11/org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:31)
at testng@6.11/org.testng.internal.ClassHelper.createInstance1(ClassHelper.java:410)
at testng@6.11/org.testng.internal.ClassHelper.createInstance(ClassHelper.java:323)
at testng@6.11/org.testng.internal.ClassImpl.getDefaultInstance(ClassImpl.java:126)
at testng@6.11/org.testng.internal.ClassImpl.getInstances(ClassImpl.java:191)
at testng@6.11/org.testng.TestClass.getInstances(TestClass.java:99)
at testng@6.11/org.testng.TestClass.initTestClassesAndInstances(TestClass.java:85)
at testng@6.11/org.testng.TestClass.init(TestClass.java:77)
at testng@6.11/org.testng.TestClass.<init>(TestClass.java:42)
at testng@6.11/org.testng.TestRunner.initMethods(TestRunner.java:423)
at testng@6.11/org.testng.TestRunner.init(TestRunner.java:250)
at testng@6.11/org.testng.TestRunner.init(TestRunner.java:220)
at testng@6.11/org.testng.TestRunner.<init>(TestRunner.java:161)
at testng@6.11/org.testng.SuiteRunner$DefaultTestRunnerFactory.newTestRunner(SuiteRunner.java:578)
at testng@6.11/org.testng.SuiteRunner.init(SuiteRunner.java:185)
at testng@6.11/org.testng.SuiteRunner.<init>(SuiteRunner.java:131)
at testng@6.11/org.testng.TestNG.createSuiteRunner(TestNG.java:1383)
at testng@6.11/org.testng.TestNG.createSuiteRunners(TestNG.java:1363)
at testng@6.11/org.testng.TestNG.runSuitesLocally(TestNG.java:1217)
at testng@6.11/org.testng.TestNG.runSuites(TestNG.java:1144)
at testng@6.11/org.testng.TestNG.run(TestNG.java:1115)
at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.runTests(TestNGTestClassProcessor.java:129)
at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.stop(TestNGTestClassProcessor.java:88)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
... 25 more
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make public io.github.sskorol.testcases.DataSupplierTests() accessible: module io.github.sskorol does not "exports io.github.sskorol.testcases" to module testng
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:337)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281)
at java.base/java.lang.reflect.Constructor.checkCanSetAccessible(Constructor.java:192)
at java.base/java.lang.reflect.Constructor.setAccessible(Constructor.java:185)
at testng@6.11/org.testng.internal.ObjectFactoryImpl.newInstance(ObjectFactoryImpl.java:22)
... 48 more
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎有点混乱,因为io.github.sskorol.testcases是src/test/java的一部分,并且没有用于测试的模块信息.所以我无法将此包导出到TestNG.假设ObjectFactoryImpl中的TestNG反射用法的根本原因是针对测试类.
有谁知道如何解决它?
环境:JDK 9(版本9 + 181),Gradle 4.1,TestNG 6.11
假设TestNG中的根本原因反映在
ObjectFactoryImpl
测试类中.
这是两个原因之一,是的.另一个是,显然,Gradle将您的测试作为一个模块运行.正如您所指出的,您的测试没有模块描述符.Gradle可以--patch-module
用来将测试添加到包含生产代码的模块中.
这个问题和答案提供了大量的背景信息和可能的修复.作为短期修复,我建议添加opens io.github.sskorol.testcases
到生产代码的模块描述符中.从它的名字来看,我猜想还没有这样的软件包,所以你要么重命名要么添加一个虚拟类(我更喜欢前者).
我也会把这个问题带到Gradle邮件列表或bug跟踪器.除非我们忽略了某些事情(完全可能),否则Gradle的行为非常不幸,因为它需要根据测试代码的需要调整生产代码的模块描述符.
归档时间: |
|
查看次数: |
730 次 |
最近记录: |