From 3997daaa65d92ca9aae6c286eeb5ce989dd27fa6 Mon Sep 17 00:00:00 2001
From: Daniel Kraus
Date: Mon, 19 Sep 2022 19:11:40 +0200
Subject: [PATCH] Upgrade Gradle, build against Java 18/19, improve modular
tests (#613, #659 / #651)
(Yes, this change does too much, but it all hangs together.)
Updates the Gradle wrapper version from 7.4 to 7.5 because that comes
with support for Java 18, which is also added to the build pipeline.
The experimental Java version is now (for another few days), Java 19.
The modular build is properly configured to really test from the
module path.
Furthermore, replaces the archived/deprecated GitHub action
sormuras/download-jdk with oracle-actions/setup-java.
Closes: #613, #659
PR: #651
---
.github/workflows/build.yml | 22 ++--
build.gradle.kts | 101 ++++++++++++++----
docs/environment-variables.adoc | 9 +-
gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 60756 bytes
gradle/wrapper/gradle-wrapper.properties | 2 +-
gradlew | 6 ++
gradlew.bat | 14 +--
src/main/java/module-info.java | 3 +
.../jupiter/ClearEnvironmentVariable.java | 6 +-
.../jupiter/DefaultLocaleExtension.java | 3 +
.../internal/PioneerAnnotationUtilsTests.java | 20 +++-
.../jupiter/DefaultLocaleTests.java | 3 +
.../EnvironmentVariableExtensionTests.java | 3 -
.../EnvironmentVariableUtilsTests.java | 3 -
src/test/module/module-info.java | 53 +++++++++
15 files changed, 195 insertions(+), 53 deletions(-)
create mode 100644 src/test/module/module-info.java
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 7c93a84e7..ca3cfda93 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,7 +1,7 @@
name: Main build
env:
- EXPERIMENTAL_JAVA: 18
+ EXPERIMENTAL_JAVA: 19
on:
# We want to trigger our builds all the time for the default branch
@@ -117,7 +117,7 @@ jobs:
timeout-minutes: 15
strategy:
matrix:
- java: [ 11, 17 ]
+ java: [ 11, 17, 18 ]
junit-version: [ '5.9.0' ]
modular: [true, false]
os: [ubuntu, macos, windows]
@@ -151,23 +151,21 @@ jobs:
modular: [true, false]
os: [ubuntu, macos, windows]
name: Experimental build with newest JDK early-access build and Gradle release candidate
- # Gradle doesn't work with JDK EA builds, so we start it with a supported Java version,
- # but execute the build on the experimental version
+ # Gradle doesn't work with JDK EA builds, so we launch it with a supported Java version,
+ # but set the Gradle toolchain to use the experimental version.
steps:
- name: Check out repo
uses: actions/checkout@v2
- - uses: sormuras/download-jdk@v1
+ - name: Set up experimental Java
+ uses: oracle-actions/setup-java@v1
with:
- feature: ${{ env.EXPERIMENTAL_JAVA }}
- - uses: actions/setup-java@v2
- with:
- java-version: ${{ env.JDK_VERSION }}
- distribution: jdkfile
- jdkFile: ${{ env.JDK_FILE }}
+ website: jdk.java.net
+ release: ${{ env.EXPERIMENTAL_JAVA }}
- name: Prepare JDK_EXPERIMENTAL env var
shell: bash
run: echo "JDK_EXPERIMENTAL=$JAVA_HOME" >> $GITHUB_ENV
- - uses: actions/setup-java@v2
+ - name: Set up supported Java
+ uses: actions/setup-java@v2
with:
java-version: 17
distribution: temurin
diff --git a/build.gradle.kts b/build.gradle.kts
index f836b7994..c022207b6 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -7,6 +7,7 @@ plugins {
id("com.diffplug.spotless") version "6.4.2"
id("at.zierler.yamlvalidator") version "1.5.0"
id("org.sonarqube") version "3.3"
+ id("org.moditect.gradleplugin") version "1.0.0-rc3"
id("org.shipkit.shipkit-changelog") version "1.1.15"
id("org.shipkit.shipkit-github-release") version "1.1.15"
id("com.github.ben-manes.versions") version "0.42.0"
@@ -22,10 +23,11 @@ plugins.withType().configureEach {
group = "org.junit-pioneer"
description = "JUnit 5 Extension Pack"
+val modularBuild : String by project
val experimentalJavaVersion : String? by project
val experimentalBuild: Boolean = experimentalJavaVersion?.isNotEmpty() ?: false
-val targetJavaVersion = JavaVersion.VERSION_11
+val targetJavaVersion = JavaVersion.VERSION_1_8
java {
if (experimentalBuild) {
@@ -33,7 +35,11 @@ java {
languageVersion.set(JavaLanguageVersion.of(experimentalJavaVersion!!))
}
} else {
- sourceCompatibility = targetJavaVersion
+ sourceCompatibility = if (modularBuild.toBoolean()) {
+ JavaVersion.VERSION_11
+ } else {
+ targetJavaVersion
+ }
}
withJavadocJar()
withSourcesJar()
@@ -107,6 +113,16 @@ sonarqube {
}
}
+moditect {
+ addMainModuleInfo {
+ version = project.version
+ overwriteExistingFiles.set(true)
+ module {
+ moduleInfoFile = rootProject.file("src/main/module/module-info.java")
+ }
+ }
+}
+
publishing {
publications {
create("maven") {
@@ -178,6 +194,14 @@ nexusPublishing {
tasks {
sourceSets {
+ main {
+ if (modularBuild.toBoolean())
+ java.srcDir("src/main/module")
+ }
+ test {
+ if (modularBuild.toBoolean())
+ java.srcDir("src/test/module")
+ }
create("demo") {
java {
srcDir("src/demo/java")
@@ -199,14 +223,40 @@ tasks {
compileJava {
options.encoding = "UTF-8"
options.compilerArgs.add("-Werror")
- // do not break the build on "exports" warnings - see CONTRIBUTING.md for details
+ // Do not break the build on "exports" warnings (see CONTRIBUTING.md for details)
options.compilerArgs.add("-Xlint:all,-exports")
}
+ // Prepares test-related JVM args
+ val moduleName = "org.junitpioneer"
+ val targetModule = if (modularBuild.toBoolean()) moduleName else "ALL-UNNAMED"
+ // See https://docs.gradle.org/current/userguide/java_testing.html#sec:java_testing_modular_patching
+ val patchModuleArg = "--patch-module=$moduleName=${compileJava.get().destinationDirectory.asFile.get().path}"
+ val testJvmArgs = listOf(
+ // Ignore these options on Java 8
+ "-XX:+IgnoreUnrecognizedVMOptions",
+ // EnvironmentVariableUtils: make java.util.Map accessible
+ "--add-opens=java.base/java.util=$targetModule",
+ // EnvironmentVariableUtils: make java.lang.System accessible
+ "--add-opens=java.base/java.lang=$targetModule",
+ patchModuleArg
+ )
+
compileTestJava {
options.encoding = "UTF-8"
options.compilerArgs.add("-Werror")
- options.compilerArgs.add("-Xlint:all")
+ if (modularBuild.toBoolean()) {
+ options.compilerArgs.add(patchModuleArg)
+ }
+ var xlintArg = "-Xlint:all"
+ if (modularBuild.toBoolean()) {
+ xlintArg += ",-exports,-requires-automatic"
+ // missing-explicit-ctor was added in Java 16. This causes errors on test classes, which don't have one.
+ if (JavaVersion.current() >= JavaVersion.VERSION_16) {
+ xlintArg += ",-missing-explicit-ctor"
+ }
+ }
+ options.compilerArgs.add(xlintArg)
}
test {
@@ -221,12 +271,12 @@ tasks {
includeTestsMatching("*Tests")
}
systemProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager")
- // `EnvironmentVariableExtension` uses reflection to change environment variables;
- // this prevents the corresponding warning (and keeps working on Java 8)
- // IF YOU ADD MORE OPTIONS; CONSIDER REPLACING `-XX:+IgnoreUnrecognizedVMOptions WITH A CONDITIONAL
- jvmArgs(
- "-XX:+IgnoreUnrecognizedVMOptions",
- "--add-opens=java.base/java.util=ALL-UNNAMED")
+ // java.security.manager was added in Java 12 (see
+ // https://www.oracle.com/java/technologies/javase/12-relnote-issues.html#JDK-8191053). We have to explicitly
+ // set it to "allow" for EnvironmentVariableUtilsTests$With_SecurityManager.
+ if (JavaVersion.current() >= JavaVersion.VERSION_12)
+ systemProperty("java.security.manager", "allow")
+ jvmArgs(testJvmArgs)
}
testing {
@@ -234,6 +284,7 @@ tasks {
val test by getting(JvmTestSuite::class) {
useJUnitJupiter()
}
+
val demoTests by registering(JvmTestSuite::class) {
dependencies {
implementation(project)
@@ -242,23 +293,33 @@ tasks {
}
sources {
- java { srcDir("src/demo/java") }
- resources { srcDir("src/demo/resources") }
+ java {
+ srcDir("src/demo/java")
+ }
+ resources {
+ srcDir("src/demo/resources")
+ }
}
- targets { all { testTask.configure {
- shouldRunAfter(test)
- filter {
- includeTestsMatching("*Demo")
+
+ targets {
+ all {
+ testTask.configure {
+ shouldRunAfter(test)
+ filter {
+ includeTestsMatching("*Demo")
+ }
+ jvmArgs(testJvmArgs)
+ }
}
- } } }
+ }
}
}
}
javadoc {
javadocTool.set(project.javaToolchains.javadocToolFor {
- // Create Javadoc with newer JDK to get the latest features, e.g. search bar
- languageVersion.set(JavaLanguageVersion.of(17))
+ // Create Javadoc with at least Java 17 to get the latest features, e.g. search bar
+ languageVersion.set(JavaLanguageVersion.of(maxOf(17, targetJavaVersion.majorVersion.toInt())))
})
options {
@@ -271,7 +332,7 @@ tasks {
// Set javadoc `--release` flag (affects which warnings and errors are reported)
// (Note: Gradle adds one leading '-' to the option on its own)
// Have to use at least Java 9 to support modular build
- addStringOption("-release", targetJavaVersion.majorVersion.toInt().toString())
+ addStringOption("-release", maxOf(11, targetJavaVersion.majorVersion.toInt()).toString())
// Enable doclint, but ignore warnings for missing tags, see
// https://docs.oracle.com/en/java/javase/17/docs/specs/man/javadoc.html#additional-options-provided-by-the-standard-doclet
diff --git a/docs/environment-variables.adoc b/docs/environment-variables.adoc
index aab5e854e..16dc7a504 100644
--- a/docs/environment-variables.adoc
+++ b/docs/environment-variables.adoc
@@ -66,8 +66,15 @@ module java.base does not "opens java.lang" to unnamed module [...]
----
The best way to prevent these warnings/errors, is to change the code under test, so this extension is no longer needed.
-The next best thing is to allow access to that specific package with `--add-opens=java.base/java.util=ALL-UNNAMED` (if you place JUnit Pioneer on the class path) or `--add-opens=java.base/java.util=org.junitpioneer` (if you place it on the module path).
+The next best thing is to allow access to that specific package:
+[source]
+----
+--add-opens java.base/java.util=$TARGET_MODULE
+--add-opens java.base/java.lang=$TARGET_MODULE
+----
+
+Where `$TARGET_MODULE` equals `ALL-UNNAMED` if you place JUnit Pioneer on the class path, or `org.junitpioneer` if you place JUnit Pioneer on the module path.
These command line options need to be added to the JVM that executes the tests:
* https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.Test.html[Gradle]
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..249e5832f090a2944b7473328c07c9755baa3196 100644
GIT binary patch
delta 10158
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
delta 9041
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
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 41dfb8790..8049c684f 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 1b6c78733..a69d9cb6c 100755
--- a/gradlew
+++ b/gradlew
@@ -205,6 +205,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \
"$@"
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
diff --git a/gradlew.bat b/gradlew.bat
index 107acd32c..f127cfd49 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,7 +25,7 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
+if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +75,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
:end
@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index bdb7f804b..653aeeeaf 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -22,11 +22,14 @@
exports org.junitpioneer.jupiter;
exports org.junitpioneer.jupiter.cartesian;
exports org.junitpioneer.jupiter.params;
+ exports org.junitpioneer.jupiter.json;
opens org.junitpioneer.vintage to org.junit.platform.commons;
opens org.junitpioneer.jupiter to org.junit.platform.commons;
opens org.junitpioneer.jupiter.cartesian to org.junit.platform.commons;
+ opens org.junitpioneer.jupiter.issue to org.junit.platform.commons;
opens org.junitpioneer.jupiter.params to org.junit.platform.commons;
+ opens org.junitpioneer.jupiter.json to org.junit.platform.commons, com.fasterxml.jackson.databind;
provides org.junit.platform.launcher.TestExecutionListener
with org.junitpioneer.jupiter.issue.IssueExtensionExecutionListener;
diff --git a/src/main/java/org/junitpioneer/jupiter/ClearEnvironmentVariable.java b/src/main/java/org/junitpioneer/jupiter/ClearEnvironmentVariable.java
index 3901f2ac9..1e543c4e3 100644
--- a/src/main/java/org/junitpioneer/jupiter/ClearEnvironmentVariable.java
+++ b/src/main/java/org/junitpioneer/jupiter/ClearEnvironmentVariable.java
@@ -35,9 +35,9 @@
* uses reflection to change them. This requires that the {@link SecurityManager}
* allows modifications and can potentially break on different operating systems and
* Java versions. Be aware that this is a fragile solution and consider finding a
- * better one for your specific situation. If you're running on Java 9 or later, you
- * may have to add {@code --add-opens=java.base/java.util=ALL-UNNAMED} to your test
- * execution to prevent warnings or even errors.
+ * better one for your specific situation. If you're running on Java 9 or later and
+ * are encountering warnings or errors, check
+ * the documentation.
*
* During
* parallel test execution,
diff --git a/src/main/java/org/junitpioneer/jupiter/DefaultLocaleExtension.java b/src/main/java/org/junitpioneer/jupiter/DefaultLocaleExtension.java
index 314085816..713f7a49d 100644
--- a/src/main/java/org/junitpioneer/jupiter/DefaultLocaleExtension.java
+++ b/src/main/java/org/junitpioneer/jupiter/DefaultLocaleExtension.java
@@ -61,6 +61,9 @@ private static Locale createFromLanguageTag(DefaultLocale annotation) {
return Locale.forLanguageTag(annotation.value());
}
+ // On Java 19+, `Locale` constructors are deprecated.
+ // We ignore them until they're removed in #658
+ @SuppressWarnings("deprecation")
private static Locale createFromParts(DefaultLocale annotation) {
String language = annotation.language();
String country = annotation.country();
diff --git a/src/test/java/org/junitpioneer/internal/PioneerAnnotationUtilsTests.java b/src/test/java/org/junitpioneer/internal/PioneerAnnotationUtilsTests.java
index abf1f4a22..de8fe26ed 100644
--- a/src/test/java/org/junitpioneer/internal/PioneerAnnotationUtilsTests.java
+++ b/src/test/java/org/junitpioneer/internal/PioneerAnnotationUtilsTests.java
@@ -506,7 +506,7 @@ void onMethods() throws NoSuchMethodException {
.allSatisfy(annotation -> assertThat(annotation)
.isInstanceOfAny(RepeatableTestAnnotation.class, NonRepeatableTestAnnotation.class,
MetaAnnotatedTestAnnotation.class))
- .extractingResultOf("value")
+ .extracting(this::resultOfValue)
.containsExactlyInAnyOrder("Inherited 4", "Inherited 5", "Inherited 6",
"Annotated with repeatable 2");
}
@@ -523,7 +523,7 @@ void onClassNotRepeated() {
.allSatisfy(annotation -> assertThat(annotation)
.isInstanceOfAny(RepeatableTestAnnotation.class, NonRepeatableTestAnnotation.class,
MetaAnnotatedTestAnnotation.class))
- .extractingResultOf("value")
+ .extracting(this::resultOfValue)
.containsExactlyInAnyOrder("Inherited 1", "Inherited 2", "Inherited 3",
"Annotated with repeatable 1");
}
@@ -539,7 +539,7 @@ void onMethodRepeated() throws NoSuchMethodException {
assertThat(result)
.hasSize(1)
.allSatisfy(annotation -> assertThat(annotation).isInstanceOf(MetaAnnotatedTestAnnotation.class))
- .extractingResultOf("value")
+ .extracting(this::resultOfValue)
.containsExactlyInAnyOrder("Annotated with repeatable 2");
}
@@ -553,10 +553,22 @@ void onClassRepeated() {
assertThat(result)
.hasSize(1)
.allSatisfy(annotation -> assertThat(annotation).isInstanceOf(MetaAnnotatedTestAnnotation.class))
- .extractingResultOf("value")
+ .extracting(this::resultOfValue)
.containsExactlyInAnyOrder("Annotated with repeatable 1");
}
+ // see https://github.com/assertj/assertj/issues/2760
+ String resultOfValue(Annotation annotation) {
+ // can't wait for type patterns!
+ if (annotation instanceof MetaAnnotatedTestAnnotation)
+ return ((MetaAnnotatedTestAnnotation) annotation).value();
+ if (annotation instanceof NonRepeatableTestAnnotation)
+ return ((NonRepeatableTestAnnotation) annotation).value();
+ if (annotation instanceof RepeatableTestAnnotation)
+ return ((RepeatableTestAnnotation) annotation).value();
+ throw new AssertionError("Cannot extract value from annotation of type " + annotation.getClass());
+ }
+
}
}
diff --git a/src/test/java/org/junitpioneer/jupiter/DefaultLocaleTests.java b/src/test/java/org/junitpioneer/jupiter/DefaultLocaleTests.java
index e336597ca..6fc7a584a 100644
--- a/src/test/java/org/junitpioneer/jupiter/DefaultLocaleTests.java
+++ b/src/test/java/org/junitpioneer/jupiter/DefaultLocaleTests.java
@@ -26,6 +26,9 @@
import org.junit.jupiter.api.extension.ExtensionConfigurationException;
import org.junitpioneer.testkit.ExecutionResults;
+// On Java 19+, `Locale` constructors are deprecated.
+// We ignore them until they're removed in #658
+@SuppressWarnings("deprecation")
@DisplayName("DefaultLocale extension")
class DefaultLocaleTests {
diff --git a/src/test/java/org/junitpioneer/jupiter/EnvironmentVariableExtensionTests.java b/src/test/java/org/junitpioneer/jupiter/EnvironmentVariableExtensionTests.java
index c012a2618..b98241c1c 100644
--- a/src/test/java/org/junitpioneer/jupiter/EnvironmentVariableExtensionTests.java
+++ b/src/test/java/org/junitpioneer/jupiter/EnvironmentVariableExtensionTests.java
@@ -28,12 +28,9 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestMethodOrder;
-import org.junit.jupiter.api.condition.EnabledForJreRange;
-import org.junit.jupiter.api.condition.JRE;
import org.junit.jupiter.api.extension.ExtensionConfigurationException;
import org.junitpioneer.testkit.ExecutionResults;
-@EnabledForJreRange(max = JRE.JAVA_16, disabledReason = "See: https://github.com/junit-pioneer/junit-pioneer/issues/509")
@DisplayName("EnvironmentVariable extension")
class EnvironmentVariableExtensionTests {
diff --git a/src/test/java/org/junitpioneer/jupiter/EnvironmentVariableUtilsTests.java b/src/test/java/org/junitpioneer/jupiter/EnvironmentVariableUtilsTests.java
index c76abd2c3..f952954e6 100644
--- a/src/test/java/org/junitpioneer/jupiter/EnvironmentVariableUtilsTests.java
+++ b/src/test/java/org/junitpioneer/jupiter/EnvironmentVariableUtilsTests.java
@@ -21,10 +21,7 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.condition.EnabledForJreRange;
-import org.junit.jupiter.api.condition.JRE;
-@EnabledForJreRange(max = JRE.JAVA_16, disabledReason = "See: https://github.com/junit-pioneer/junit-pioneer/issues/509")
@DisplayName("JUnitPioneer system environment utilities")
@WritesEnvironmentVariable
class EnvironmentVariableUtilsTests {
diff --git a/src/test/module/module-info.java b/src/test/module/module-info.java
new file mode 100644
index 000000000..b5213784f
--- /dev/null
+++ b/src/test/module/module-info.java
@@ -0,0 +1,53 @@
+/**
+ * JUnit Pioneer provides extensions for JUnit 5
+ * and its Jupiter API.
+ *
+ *
Pioneer does not limit itself to proven ideas with wide application but is purposely open to
+ * experiments. It aims to spin off successful and cohesive portions into sibling projects or back
+ * into the JUnit 5 code base.
+ *
+ *
The dependencies on Jupiter modules could be marked as transitive
but that would
+ * allow users who depend on this module to not `require` org.junit.*, which would be backwards.
+ */
+module org.junitpioneer {
+ // see Javadoc for why these aren't transitive
+ requires org.junit.jupiter.api;
+ requires org.junit.jupiter.params;
+ requires org.junit.platform.launcher;
+
+ requires static com.fasterxml.jackson.core;
+ requires static com.fasterxml.jackson.databind;
+
+ exports org.junitpioneer.vintage;
+ exports org.junitpioneer.jupiter;
+ exports org.junitpioneer.jupiter.cartesian;
+ exports org.junitpioneer.jupiter.params;
+ exports org.junitpioneer.jupiter.json;
+
+ opens org.junitpioneer.vintage to org.junit.platform.commons;
+ opens org.junitpioneer.jupiter to org.junit.platform.commons, nl.jqno.equalsverifier;
+ opens org.junitpioneer.jupiter.cartesian to org.junit.platform.commons;
+ opens org.junitpioneer.jupiter.issue to org.junit.platform.commons;
+ opens org.junitpioneer.jupiter.params to org.junit.platform.commons;
+ opens org.junitpioneer.jupiter.json to org.junit.platform.commons, com.fasterxml.jackson.databind;
+
+ provides org.junit.platform.launcher.TestExecutionListener
+ with org.junitpioneer.jupiter.issue.IssueExtensionExecutionListener;
+ provides org.junitpioneer.jupiter.IssueProcessor
+ with org.junitpioneer.jupiter.issue.StoringIssueProcessor;
+ uses org.junitpioneer.jupiter.IssueProcessor;
+
+ requires org.junit.platform.testkit;
+ requires org.mockito;
+ requires org.assertj.core;
+ requires nl.jqno.equalsverifier;
+
+ // via org.assertj.core
+ requires java.instrument;
+ requires jdk.unsupported;
+ // via nl.jqno.equalsverifier
+ requires java.sql;
+
+ opens org.junitpioneer.internal to org.junit.platform.commons;
+ opens org.junitpioneer.testkit to org.junit.platform.commons;
+}