我有几个不同的 gradle 项目(Proj_A、Proj_B、Proj_C 等),其中仅包含 JUnit5 测试。我有另一个库包
FooLibrary
,其中我定义了 ResultAnalyzer
来对测试结果执行一些操作。
import lombok.extern.slf4j.Slf4j;
import org.junit.platform.launcher.TestPlan;
import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
@Slf4j
public class ResultAnalyzer extends SummaryGeneratingListener {
@Override
public void testPlanExecutionFinished(TestPlan testPlan) {
// This method is invoked after all tests in all containers is finished
log.info("[CustomTestSummary]: Running after all tests are done.");
super.testPlanExecutionFinished(testPlan);
analyzeResult();
}
private void analyzeResult() {
var summary = getSummary();
var failures = summary.getFailures();
final var testsSucceededCount = summary.getTestsSucceededCount();
log.info("[CustomTestSummary]: Passed: {}", testsSucceededCount);
// Do something
}
}
我还在同一个
src/test/resources/META-INF/services/org.junit.platform.launcher.TestExecutionListener
包中添加了文件 FooLibrary
。
现在,我想在所有测试项目(
FooLibrary
,Proj_A
,Proj_B
)中使用这个Proj_C
并处理他们的测试执行结果。但是,所以我在所有测试包中添加了依赖项并尝试运行测试,但出现以下错误:
Caused by: java.util.ServiceConfigurationError: org.junit.platform.launcher.TestExecutionListener: Provider com.apple.store.qe.utils.ResultAnalyzer not found
at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:593)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(ServiceLoader.java:1219)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1228)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:132)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
at org.junit.platform.launcher.core.LauncherFactory.registerTestExecutionListeners(LauncherFactory.java:179)
at org.junit.platform.launcher.core.LauncherFactory.createDefaultLauncher(LauncherFactory.java:137)
at org.junit.platform.launcher.core.LauncherFactory.openSession(LauncherFactory.java:98)
at org.junit.platform.launcher.core.LauncherFactory.openSession(LauncherFactory.java:82)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$BackwardsCompatibleLauncherSession.open(JUnitPlatformTestClassProcessor.java:318)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.createTestExecutor(JUnitPlatformTestClassProcessor.java:81)
at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.startProcessing(AbstractJUnitTestClassProcessor.java:50)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.startProcessing(SuiteTestClassProcessor.java:42)
... 18 more
我分析了
FooLibrary
的.jar依赖内容,可以看到ResultAnalyzer
被捆绑在jar中。如果我将 ResultAnalyzer
移至测试包,它就可以正常工作。
那么,我需要进行哪些更改才能将
ResultAnalyzer
保留在 FooLibrary
中并且不需要复制所有测试包?有人可以分享一些关于我如何实现相同目标的指示吗?
我还在同一个 FooLibrary 包中添加了文件 src/test/resources/META-INF/services/org.junit.platform.launcher.TestExecutionListener 。
jar artefact 中通常不提供测试模块,因此必须在
中配置测试执行监听器src/main/resources/META-INF/services
.
为了出现在 FooLibrary 的 jar 文件中。
警告:由于未提供有关 Gradle 构建文件和源代码结构的完整信息,我的猜测可能是错误的。