Skip to content

Commit 889ce73

Browse files
authored
Replace junit-dataprovider with junit-jupiter-params (#1655)
Resolves #1471
2 parents dbb796e + ca4035c commit 889ce73

102 files changed

Lines changed: 4345 additions & 4902 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

archunit-3rd-party-test/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,5 @@ dependencies {
1010
testImplementation project(path: ':archunit', configuration: 'tests')
1111
testImplementation exampleLibs.springBootLoader
1212
dependency.addGuava { dependencyNotation, config -> testImplementation(dependencyNotation, config) }
13-
testImplementation libs.junit4
14-
testImplementation libs.junitDataprovider
1513
testImplementation libs.assertj
1614
}

archunit-3rd-party-test/src/test/java/com/tngtech/archunit/core/importer/SpringLocationsTest.java

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,10 @@
1010
import java.util.stream.Stream;
1111

1212
import com.tngtech.archunit.core.importer.testexamples.SomeEnum;
13-
import com.tngtech.archunit.testutil.SystemPropertiesRule;
14-
import com.tngtech.java.junit.dataprovider.DataProvider;
15-
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
16-
import com.tngtech.java.junit.dataprovider.UseDataProvider;
17-
import org.junit.Rule;
18-
import org.junit.Test;
19-
import org.junit.runner.RunWith;
13+
import com.tngtech.archunit.testutil.SystemPropertiesExtension;
14+
import org.junit.jupiter.api.extension.RegisterExtension;
15+
import org.junit.jupiter.params.ParameterizedTest;
16+
import org.junit.jupiter.params.provider.MethodSource;
2017
import org.springframework.boot.loader.LaunchedURLClassLoader;
2118
import org.springframework.boot.loader.archive.Archive;
2219
import org.springframework.boot.loader.archive.JarFileArchive;
@@ -28,31 +25,28 @@
2825
import static com.tngtech.archunit.core.importer.LocationTest.classFileEntry;
2926
import static com.tngtech.archunit.core.importer.LocationTest.urlOfClass;
3027
import static com.tngtech.archunit.core.importer.LocationsTest.unchecked;
31-
import static com.tngtech.java.junit.dataprovider.DataProviders.testForEach;
3228
import static org.assertj.core.api.Assertions.assertThat;
3329

34-
@RunWith(DataProviderRunner.class)
3530
public class SpringLocationsTest {
3631
/**
3732
* Spring Boot configures some system properties that we want to reset afterward (e.g. custom URL stream handler)
3833
*/
39-
@Rule
40-
public final SystemPropertiesRule systemPropertiesRule = new SystemPropertiesRule();
34+
@RegisterExtension
35+
final SystemPropertiesExtension systemPropertiesExtension = new SystemPropertiesExtension();
4136

42-
@DataProvider
43-
public static Object[][] springBootJars() {
37+
static Stream<TestJarFile> springBootJars() {
4438
Function<Function<TestJarFile, TestJarFile>, TestJarFile> createSpringBootJar = setUpJarFile -> setUpJarFile.apply(new TestJarFile())
4539
.withNestedClassFilesDirectory("BOOT-INF/classes")
4640
.withEntry(classFileEntry(SomeEnum.class).toAbsolutePath());
4741

48-
return testForEach(
42+
return Stream.of(
4943
createSpringBootJar.apply(TestJarFile::withDirectoryEntries),
5044
createSpringBootJar.apply(TestJarFile::withoutDirectoryEntries)
5145
);
5246
}
5347

54-
@Test
55-
@UseDataProvider("springBootJars")
48+
@ParameterizedTest
49+
@MethodSource("springBootJars")
5650
public void finds_locations_of_packages_from_Spring_Boot_ClassLoader_for_JARs(TestJarFile jarFileToTest) throws Exception {
5751
try (JarFile jarFile = jarFileToTest.create()) {
5852

archunit-junit/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ dependencies {
3939
dependency.addGuava { dependencyNotation, config -> implementation(dependencyNotation, config) }
4040

4141
testImplementation libs.junit4
42-
testImplementation libs.junitDataprovider
4342
testImplementation libs.mockito
43+
testImplementation libs.mockito.junit5
4444
testImplementation libs.assertj
4545
testImplementation project(path: ':archunit', configuration: 'tests')
4646

archunit-junit/src/test/java/com/tngtech/archunit/junit/internal/ClassCacheTest.java

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Collection;
44
import java.util.Collections;
55
import java.util.Set;
6+
import java.util.stream.Stream;
67

78
import com.tngtech.archunit.core.domain.JavaClass;
89
import com.tngtech.archunit.core.domain.JavaClasses;
@@ -12,24 +13,22 @@
1213
import com.tngtech.archunit.core.importer.Locations;
1314
import com.tngtech.archunit.junit.LocationProvider;
1415
import com.tngtech.archunit.junit.internal.ClassCache.CacheClassFileImporter;
15-
import com.tngtech.archunit.testutil.ArchConfigurationRule;
16-
import com.tngtech.java.junit.dataprovider.DataProvider;
17-
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
18-
import com.tngtech.java.junit.dataprovider.UseDataProvider;
16+
import com.tngtech.archunit.testutil.ArchConfigurationExtension;
1917
import org.assertj.core.api.Condition;
2018
import org.junit.Rule;
21-
import org.junit.Test;
22-
import org.junit.runner.RunWith;
19+
import org.junit.jupiter.api.Test;
20+
import org.junit.jupiter.api.extension.ExtendWith;
21+
import org.junit.jupiter.api.extension.RegisterExtension;
22+
import org.junit.jupiter.params.ParameterizedTest;
23+
import org.junit.jupiter.params.provider.MethodSource;
2324
import org.mockito.ArgumentCaptor;
2425
import org.mockito.Captor;
2526
import org.mockito.InjectMocks;
2627
import org.mockito.Spy;
27-
import org.mockito.junit.MockitoJUnit;
28-
import org.mockito.junit.MockitoRule;
28+
import org.mockito.junit.jupiter.MockitoExtension;
2929

3030
import static com.tngtech.archunit.junit.CacheMode.PER_CLASS;
3131
import static com.tngtech.archunit.testutil.Assertions.assertThatTypes;
32-
import static com.tngtech.java.junit.dataprovider.DataProviders.testForEach;
3332
import static org.assertj.core.api.Assertions.assertThat;
3433
import static org.assertj.core.api.Assertions.assertThatThrownBy;
3534
import static org.mockito.ArgumentMatchers.anyCollection;
@@ -39,15 +38,11 @@
3938
import static org.mockito.Mockito.verify;
4039
import static org.mockito.Mockito.verifyNoMoreInteractions;
4140

42-
@RunWith(DataProviderRunner.class)
41+
@ExtendWith(MockitoExtension.class)
4342
public class ClassCacheTest {
4443

45-
@Rule
46-
public final MockitoRule mockitoRule = MockitoJUnit.rule();
47-
48-
@Rule
49-
public final ArchConfigurationRule archConfigurationRule = new ArchConfigurationRule()
50-
.resolveAdditionalDependenciesFromClassPath(false);
44+
@RegisterExtension
45+
public final ArchConfigurationExtension archConfigurationRule = new ArchConfigurationExtension().resolveAdditionalDependenciesFromClassPath(false);
5146

5247
@Spy
5348
private CacheClassFileImporter cacheClassFileImporter;
@@ -186,15 +181,14 @@ public void non_existing_packages_are_ignored() {
186181
verifyNumberOfImports(1);
187182
}
188183

189-
@DataProvider
190-
public static Object[][] test_classes_without_any_imported_classes() {
191-
return testForEach(
184+
static Stream<TestAnalysisRequest> test_classes_without_any_imported_classes() {
185+
return Stream.of(
192186
new TestAnalysisRequest().withPackages("does.not.exist"),
193187
new TestAnalysisRequest().withLocationProviders(EmptyLocations.class));
194188
}
195189

196-
@Test
197-
@UseDataProvider("test_classes_without_any_imported_classes")
190+
@ParameterizedTest
191+
@MethodSource("test_classes_without_any_imported_classes")
198192
public void when_there_are_only_nonexisting_sources_nothing_is_imported(TestAnalysisRequest analysisRequest) {
199193
JavaClasses classes = cache.getClassesToAnalyzeFor(TestClass.class, analysisRequest);
200194

archunit-maven-test/pom.xml.template

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
#{exampleLibs.jakartaAnnotations}
5959
#{exampleLibs.guice}
6060
#{libs.junit4:test}
61-
#{libs.junitDataprovider:test}
6261
#{libs.assertj:test}
6362
#{exampleLibs.joox:test}
6463
#{additionalDependencies}

archunit/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ dependencies {
1313
testImplementation libs.log4j.api
1414
testImplementation libs.log4j.core
1515
testImplementation libs.junit4
16-
testImplementation libs.junitDataprovider
1716
testImplementation libs.mockito
17+
testImplementation libs.mockito.junit5
1818
testImplementation libs.assertj
1919
testImplementation(libs.assertj.guava) {
2020
exclude module: 'assertj-core'

archunit/src/jdk16test/java/com/tngtech/archunit/core/importer/ClassFileImporterAccessesNewerJavaVersionTest.java

Lines changed: 35 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,57 +12,47 @@
1212
import com.tngtech.archunit.core.importer.testexamples.methodresolution.OnlyDefinedInCommonAncestor;
1313
import com.tngtech.archunit.core.importer.testexamples.methodresolution.OnlyLeftAncestorOverridesRootMethod;
1414
import com.tngtech.archunit.core.importer.testexamples.methodresolution.OnlyRightAncestorOverridesRootMethod;
15-
import com.tngtech.java.junit.dataprovider.DataProvider;
16-
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
17-
import com.tngtech.java.junit.dataprovider.UseDataProvider;
18-
import org.junit.Test;
19-
import org.junit.runner.RunWith;
15+
import org.junit.jupiter.params.ParameterizedTest;
16+
import org.junit.jupiter.params.provider.ValueSource;
2017

2118
import static com.google.common.collect.Iterables.getOnlyElement;
2219
import static com.tngtech.archunit.testutil.Assertions.assertThat;
23-
import static com.tngtech.java.junit.dataprovider.DataProviders.testForEach;
2420

25-
@RunWith(DataProviderRunner.class)
2621
public class ClassFileImporterAccessesNewerJavaVersionTest {
2722

28-
@DataProvider
29-
public static Object[][] method_resolution_scenarios() {
30-
return testForEach(
31-
OnlyDefinedInCommonAncestor.class,
32-
OnlyLeftAncestorOverridesRootMethod.class,
33-
OnlyRightAncestorOverridesRootMethod.class,
34-
LeftAncestorPrecedesRightAncestor.class,
35-
ChildOverridesAllMethods.class,
36-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftLeftHasPrecedence.class,
37-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftRightHasPrecedenceOverRight.class,
38-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.RightLeftHasPrecedenceOverRightRight.class,
39-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.RightRightIsPickedIfThereIsNoAlternative.class,
40-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftOverriddenHasPrecedenceOverParents.class,
41-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.RightOverriddenHasPrecedenceOverParents.class,
42-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftLeftHasPrecedenceOverOverriddenRight.class,
43-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftRightHasPrecedenceOverOverriddenRight.class,
44-
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftOverriddenHasPrecedenceOverRightOverridden.class,
45-
DeterminesMethodAnalogouslyToReflectionApi.ClassHasPrecedenceOverInterface.ParentClassHasPrecedenceOverChildInterfaces.class,
46-
DeterminesMethodAnalogouslyToReflectionApi.ClassHasPrecedenceOverInterface.GrandParentClassHasPrecedenceOverChildInterfaces.class,
47-
DeterminesMethodAnalogouslyToReflectionApi.InterfaceOnParentHasPrecedenceOverInterfaceOnChild.LeftLeftOnGrandparentHasPrecedenceOverAllOthers.class,
48-
DeterminesMethodAnalogouslyToReflectionApi.InterfaceOnParentHasPrecedenceOverInterfaceOnChild.LeftRightOnGrandparentHasPrecedenceOverLeftOnParent.class,
49-
DeterminesMethodAnalogouslyToReflectionApi.InterfaceOnParentHasPrecedenceOverInterfaceOnChild.RightLeftOnGrandparentHasPrecedenceOverLeftAndRightOnParent.class,
50-
DeterminesMethodAnalogouslyToReflectionApi.InterfaceOnParentHasPrecedenceOverInterfaceOnChild.RightRightOnGrandparentHasPrecedenceOverLeftAndRightOnParent.class,
51-
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.RightWithMoreSpecificReturnOnParentTypeHasPrecedenceOverAllOthers.class,
52-
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.LeftWithMoreSpecificReturnTypeHasPrecedenceRightWithMoreSpecificReturnType.class,
53-
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.ParentInterfaceWithMoreSpecificReturnTypeHasPrecedenceOverAllOthers.class,
54-
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.InterfaceWithMoreSpecificReturnTypeHasPrecedenceOverGrandParentClass.class,
55-
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.ParentInterfaceOnParentClassWithMoreSpecificReturnTypeHasPrecedenceOverGrandParentClass.class,
56-
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.GrandParentInterfaceWithMoreSpecificReturnTypeHasPrecedenceOverAllOthers.class,
57-
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.GrandParentInterfaceWithMoreSpecificReturnTypeHasPrecedenceOverFirstParentInterfaceWithMoreSpecificReturnType.class,
58-
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.GrandParentInterfaceWithMoreSpecificReturnTypeHasPrecedenceOverAllParentInterfacesWithMoreSpecificReturnType.class,
59-
DeterminesMethodAnalogouslyToReflectionApi.StaticMethodsInInterfacesAreIgnored.class
60-
);
61-
}
62-
63-
@Test
64-
@UseDataProvider("method_resolution_scenarios")
65-
public void resolves_method_call_targets(Class<?> scenario) throws NoSuchMethodException {
23+
@ParameterizedTest
24+
@ValueSource(classes = {
25+
OnlyDefinedInCommonAncestor.class,
26+
OnlyLeftAncestorOverridesRootMethod.class,
27+
OnlyRightAncestorOverridesRootMethod.class,
28+
LeftAncestorPrecedesRightAncestor.class,
29+
ChildOverridesAllMethods.class,
30+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftLeftHasPrecedence.class,
31+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftRightHasPrecedenceOverRight.class,
32+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.RightLeftHasPrecedenceOverRightRight.class,
33+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.RightRightIsPickedIfThereIsNoAlternative.class,
34+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftOverriddenHasPrecedenceOverParents.class,
35+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.RightOverriddenHasPrecedenceOverParents.class,
36+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftLeftHasPrecedenceOverOverriddenRight.class,
37+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftRightHasPrecedenceOverOverriddenRight.class,
38+
DeterminesMethodAnalogouslyToReflectionApi.EquivalentMethodsAreChosenDepthFirst.LeftOverriddenHasPrecedenceOverRightOverridden.class,
39+
DeterminesMethodAnalogouslyToReflectionApi.ClassHasPrecedenceOverInterface.ParentClassHasPrecedenceOverChildInterfaces.class,
40+
DeterminesMethodAnalogouslyToReflectionApi.ClassHasPrecedenceOverInterface.GrandParentClassHasPrecedenceOverChildInterfaces.class,
41+
DeterminesMethodAnalogouslyToReflectionApi.InterfaceOnParentHasPrecedenceOverInterfaceOnChild.LeftLeftOnGrandparentHasPrecedenceOverAllOthers.class,
42+
DeterminesMethodAnalogouslyToReflectionApi.InterfaceOnParentHasPrecedenceOverInterfaceOnChild.LeftRightOnGrandparentHasPrecedenceOverLeftOnParent.class,
43+
DeterminesMethodAnalogouslyToReflectionApi.InterfaceOnParentHasPrecedenceOverInterfaceOnChild.RightLeftOnGrandparentHasPrecedenceOverLeftAndRightOnParent.class,
44+
DeterminesMethodAnalogouslyToReflectionApi.InterfaceOnParentHasPrecedenceOverInterfaceOnChild.RightRightOnGrandparentHasPrecedenceOverLeftAndRightOnParent.class,
45+
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.RightWithMoreSpecificReturnOnParentTypeHasPrecedenceOverAllOthers.class,
46+
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.LeftWithMoreSpecificReturnTypeHasPrecedenceRightWithMoreSpecificReturnType.class,
47+
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.ParentInterfaceWithMoreSpecificReturnTypeHasPrecedenceOverAllOthers.class,
48+
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.InterfaceWithMoreSpecificReturnTypeHasPrecedenceOverGrandParentClass.class,
49+
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.ParentInterfaceOnParentClassWithMoreSpecificReturnTypeHasPrecedenceOverGrandParentClass.class,
50+
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.GrandParentInterfaceWithMoreSpecificReturnTypeHasPrecedenceOverAllOthers.class,
51+
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.GrandParentInterfaceWithMoreSpecificReturnTypeHasPrecedenceOverFirstParentInterfaceWithMoreSpecificReturnType.class,
52+
DeterminesMethodAnalogouslyToReflectionApi.MoreSpecificReturnTypeHasPrecedence.GrandParentInterfaceWithMoreSpecificReturnTypeHasPrecedenceOverAllParentInterfacesWithMoreSpecificReturnType.class,
53+
DeterminesMethodAnalogouslyToReflectionApi.StaticMethodsInInterfacesAreIgnored.class
54+
})
55+
void resolves_method_call_targets(Class<?> scenario) throws NoSuchMethodException {
6656
JavaMethod origin = new ClassFileImporter().importPackagesOf(scenario).get(scenario).getMethod("scenario");
6757

6858
MethodCallTarget target = getOnlyElement(origin.getMethodCallsFromSelf()).getTarget();

archunit/src/jdk16test/java/com/tngtech/archunit/core/importer/ClassFileImporterRecordsTest.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,21 @@
44
import com.tngtech.archunit.core.domain.JavaConstructor;
55
import com.tngtech.archunit.core.domain.JavaField;
66
import com.tngtech.archunit.core.domain.JavaMethod;
7-
import com.tngtech.java.junit.dataprovider.DataProvider;
8-
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
9-
import com.tngtech.java.junit.dataprovider.UseDataProvider;
10-
import org.junit.Test;
11-
import org.junit.runner.RunWith;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.params.ParameterizedTest;
9+
import org.junit.jupiter.params.provider.ValueSource;
1210

1311
import static com.tngtech.archunit.testutil.Assertions.assertThat;
14-
import static com.tngtech.java.junit.dataprovider.DataProviders.testForEach;
1512

16-
@RunWith(DataProviderRunner.class)
1713
public class ClassFileImporterRecordsTest {
18-
@DataProvider
19-
public static Object[][] imports_record() {
20-
record SimpleRecord(String component1, int component2) {
21-
}
22-
record EmptyRecord() {
23-
}
24-
return testForEach(SimpleRecord.class, EmptyRecord.class);
14+
record SimpleRecord(String component1, int component2) {
15+
}
16+
record EmptyRecord() {
2517
}
2618

27-
@Test
28-
@UseDataProvider
29-
public void imports_record(Class<?> recordToImport) {
19+
@ParameterizedTest
20+
@ValueSource(classes = {SimpleRecord.class, EmptyRecord.class})
21+
void imports_record(Class<?> recordToImport) {
3022
JavaClass javaClass = new ClassFileImporter().importClasses(recordToImport, Record.class).get(recordToImport);
3123

3224
assertThat(javaClass)

0 commit comments

Comments
 (0)