/* * Copyright 2015-2017 the original author or authors. * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html */ package org.junit.jupiter.engine.discovery; import static java.util.Collections.singleton; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.engine.discovery.JupiterUniqueIdBuilder.engineId; import static org.junit.jupiter.engine.discovery.JupiterUniqueIdBuilder.uniqueIdForClass; import static org.junit.jupiter.engine.discovery.JupiterUniqueIdBuilder.uniqueIdForMethod; import static org.junit.jupiter.engine.discovery.JupiterUniqueIdBuilder.uniqueIdForTestFactoryMethod; import static org.junit.jupiter.engine.discovery.JupiterUniqueIdBuilder.uniqueIdForTestTemplateMethod; import static org.junit.jupiter.engine.discovery.JupiterUniqueIdBuilder.uniqueIdForTopLevelClass; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClasspathRoots; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectMethod; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectPackage; import static org.junit.platform.engine.discovery.DiscoverySelectors.selectUniqueId; import static org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.request; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.engine.descriptor.JupiterEngineDescriptor; import org.junit.jupiter.engine.descriptor.TestFactoryTestDescriptor; import org.junit.jupiter.engine.descriptor.TestTemplateInvocationTestDescriptor; import org.junit.jupiter.engine.descriptor.subpackage.Class1WithTestCases; import org.junit.jupiter.engine.descriptor.subpackage.Class2WithTestCases; import org.junit.jupiter.engine.descriptor.subpackage.ClassWithStaticInnerTestCases; import org.junit.platform.commons.JUnitException; import org.junit.platform.commons.util.PreconditionViolationException; import org.junit.platform.commons.util.ReflectionUtils; import org.junit.platform.engine.EngineDiscoveryRequest; import org.junit.platform.engine.TestDescriptor; import org.junit.platform.engine.UniqueId; import org.junit.platform.engine.discovery.ClassSelector; import org.junit.platform.engine.discovery.ClasspathRootSelector; import org.junit.platform.engine.discovery.MethodSelector; import org.junit.platform.engine.discovery.PackageSelector; import org.junit.platform.engine.discovery.UniqueIdSelector; /** * @since 5.0 */ class DiscoverySelectorResolverTests { private final JupiterEngineDescriptor engineDescriptor = new JupiterEngineDescriptor(engineId()); private final DiscoverySelectorResolver resolver = new DiscoverySelectorResolver(); @Test void singleClassResolution() { ClassSelector selector = selectClass(MyTestClass.class); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(4, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(MyTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test1()")); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test2()")); assertThat(uniqueIds).contains(uniqueIdForTestFactoryMethod(MyTestClass.class, "dynamicTest()")); } @Test void duplicateClassSelectorOnlyResolvesOnce() { resolver.resolveSelectors(request().selectors( // selectClass(MyTestClass.class), // selectClass(MyTestClass.class) // ).build(), engineDescriptor); assertEquals(4, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(MyTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test1()")); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test2()")); assertThat(uniqueIds).contains(uniqueIdForTestFactoryMethod(MyTestClass.class, "dynamicTest()")); } @Test void twoClassesResolution() { ClassSelector selector1 = selectClass(MyTestClass.class); ClassSelector selector2 = selectClass(YourTestClass.class); resolver.resolveSelectors(request().selectors(selector1, selector2).build(), engineDescriptor); assertEquals(7, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(MyTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test1()")); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test2()")); assertThat(uniqueIds).contains(uniqueIdForTestFactoryMethod(MyTestClass.class, "dynamicTest()")); assertThat(uniqueIds).contains(uniqueIdForClass(YourTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(YourTestClass.class, "test3()")); assertThat(uniqueIds).contains(uniqueIdForMethod(YourTestClass.class, "test4()")); } @Test void classResolutionOfStaticNestedClass() { ClassSelector selector = selectClass(OtherTestClass.NestedTestClass.class); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(3, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(OtherTestClass.NestedTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(OtherTestClass.NestedTestClass.class, "test5()")); assertThat(uniqueIds).contains(uniqueIdForMethod(OtherTestClass.NestedTestClass.class, "test6()")); } @Test void methodResolution() throws NoSuchMethodException { Method test1 = MyTestClass.class.getDeclaredMethod("test1"); MethodSelector selector = selectMethod(test1.getDeclaringClass(), test1); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(2, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(MyTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test1()")); } @Test void methodResolutionFromInheritedMethod() throws NoSuchMethodException { MethodSelector selector = selectMethod(HerTestClass.class, MyTestClass.class.getDeclaredMethod("test1")); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(2, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(HerTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(HerTestClass.class, "test1()")); } @Test void resolvingSelectorOfNonTestMethodResolvesNothing() throws NoSuchMethodException { Method notATest = MyTestClass.class.getDeclaredMethod("notATest"); MethodSelector selector = selectMethod(notATest.getDeclaringClass(), notATest); EngineDiscoveryRequest request = request().selectors(selector).build(); resolver.resolveSelectors(request, engineDescriptor); assertTrue(engineDescriptor.getDescendants().isEmpty()); } @Test void classResolutionByUniqueId() { UniqueIdSelector selector = selectUniqueId(uniqueIdForClass(MyTestClass.class).toString()); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(4, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(MyTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test1()")); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test2()")); assertThat(uniqueIds).contains(uniqueIdForTestFactoryMethod(MyTestClass.class, "dynamicTest()")); } @Test void staticNestedClassResolutionByUniqueId() { UniqueIdSelector selector = selectUniqueId(uniqueIdForClass(OtherTestClass.NestedTestClass.class).toString()); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(3, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(OtherTestClass.NestedTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(OtherTestClass.NestedTestClass.class, "test5()")); assertThat(uniqueIds).contains(uniqueIdForMethod(OtherTestClass.NestedTestClass.class, "test6()")); } @Test void methodOfInnerClassByUniqueId() { UniqueIdSelector selector = selectUniqueId( uniqueIdForMethod(OtherTestClass.NestedTestClass.class, "test5()").toString()); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(2, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(OtherTestClass.NestedTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(OtherTestClass.NestedTestClass.class, "test5()")); } @Test void resolvingUniqueIdWithUnknownSegmentTypeResolvesNothing() { UniqueIdSelector selector = selectUniqueId(engineId().append("bogus", "enigma").toString()); EngineDiscoveryRequest request = request().selectors(selector).build(); resolver.resolveSelectors(request, engineDescriptor); assertTrue(engineDescriptor.getDescendants().isEmpty()); } @Test void resolvingUniqueIdOfNonTestMethodResolvesNothing() { UniqueIdSelector selector = selectUniqueId(uniqueIdForMethod(MyTestClass.class, "notATest()")); EngineDiscoveryRequest request = request().selectors(selector).build(); resolver.resolveSelectors(request, engineDescriptor); assertTrue(engineDescriptor.getDescendants().isEmpty()); } @Test void methodResolutionByUniqueIdWithMissingMethodName() { UniqueIdSelector selector = selectUniqueId(uniqueIdForMethod(getClass(), "()")); assertMethodDoesNotMatchPattern(selector); } @Test void methodResolutionByUniqueIdWithMissingParameters() { UniqueIdSelector selector = selectUniqueId(uniqueIdForMethod(getClass(), "methodName")); assertMethodDoesNotMatchPattern(selector); } @Test void methodResolutionByUniqueIdWithBogusParameters() { UniqueIdSelector selector = selectUniqueId( uniqueIdForMethod(getClass(), "methodName(java.lang.String, junit.foo.Enigma)")); Exception exception = assertThrows(JUnitException.class, () -> resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor)); assertThat(exception).hasMessageStartingWith("Failed to load parameter type"); assertThat(exception).hasMessageContaining("junit.foo.Enigma"); } private void assertMethodDoesNotMatchPattern(UniqueIdSelector selector) { Exception exception = assertThrows(PreconditionViolationException.class, () -> resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor)); assertThat(exception).hasMessageStartingWith("Method"); assertThat(exception).hasMessageContaining("does not match pattern"); } @Test void methodResolutionByUniqueId() { UniqueIdSelector selector = selectUniqueId(uniqueIdForMethod(MyTestClass.class, "test1()").toString()); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(2, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(MyTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test1()")); } @Test void methodResolutionByUniqueIdFromInheritedClass() { UniqueIdSelector selector = selectUniqueId(uniqueIdForMethod(HerTestClass.class, "test1()").toString()); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(2, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(HerTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(HerTestClass.class, "test1()")); } @Test void methodResolutionByUniqueIdWithParams() { UniqueIdSelector selector = selectUniqueId( uniqueIdForMethod(HerTestClass.class, "test7(java.lang.String)").toString()); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(2, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(HerTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(HerTestClass.class, "test7(java.lang.String)")); } @Test void resolvingUniqueIdWithWrongParamsResolvesNothing() { UniqueIdSelector selector = selectUniqueId( uniqueIdForMethod(HerTestClass.class, "test7(java.math.BigDecimal)").toString()); EngineDiscoveryRequest request = request().selectors(selector).build(); resolver.resolveSelectors(request, engineDescriptor); assertTrue(engineDescriptor.getDescendants().isEmpty()); } @Test void twoMethodResolutionsByUniqueId() { UniqueIdSelector selector1 = selectUniqueId(uniqueIdForMethod(MyTestClass.class, "test1()").toString()); UniqueIdSelector selector2 = selectUniqueId(uniqueIdForMethod(MyTestClass.class, "test2()").toString()); // adding same selector twice should have no effect resolver.resolveSelectors(request().selectors(selector1, selector2, selector2).build(), engineDescriptor); assertEquals(3, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(MyTestClass.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test1()")); assertThat(uniqueIds).contains(uniqueIdForMethod(MyTestClass.class, "test2()")); TestDescriptor classFromMethod1 = descriptorByUniqueId( uniqueIdForMethod(MyTestClass.class, "test1()")).getParent().get(); TestDescriptor classFromMethod2 = descriptorByUniqueId( uniqueIdForMethod(MyTestClass.class, "test2()")).getParent().get(); assertEquals(classFromMethod1, classFromMethod2); assertSame(classFromMethod1, classFromMethod2); } @Test void resolvingDynamicTestByUniqueIdResolvesOnlyUpToParentTestFactory() { UniqueIdSelector selector = selectUniqueId( uniqueIdForTestFactoryMethod(MyTestClass.class, "dynamicTest()").append( TestFactoryTestDescriptor.DYNAMIC_TEST_SEGMENT_TYPE, "#1")); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertThat(engineDescriptor.getDescendants()).hasSize(2); assertThat(uniqueIds()).containsSequence(uniqueIdForClass(MyTestClass.class), uniqueIdForTestFactoryMethod(MyTestClass.class, "dynamicTest()")); } @Test void resolvingTestFactoryMethodByUniqueId() { UniqueIdSelector selector = selectUniqueId(uniqueIdForTestFactoryMethod(MyTestClass.class, "dynamicTest()")); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertThat(engineDescriptor.getDescendants()).hasSize(2); assertThat(uniqueIds()).containsSequence(uniqueIdForClass(MyTestClass.class), uniqueIdForTestFactoryMethod(MyTestClass.class, "dynamicTest()")); } @Test void packageResolutionUsingExplicitBasePackage() { PackageSelector selector = selectPackage("org.junit.jupiter.engine.descriptor.subpackage"); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(6, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(Class1WithTestCases.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(Class1WithTestCases.class, "test1()")); assertThat(uniqueIds).contains(uniqueIdForClass(Class2WithTestCases.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(Class2WithTestCases.class, "test2()")); assertThat(uniqueIds).contains( uniqueIdForMethod(ClassWithStaticInnerTestCases.ShouldBeDiscovered.class, "test1()")); } @Test void packageResolutionUsingDefaultPackage() { resolver.resolveSelectors(request().selectors(selectPackage("")).build(), engineDescriptor); // 150 is completely arbitrary. The actual number is likely much higher. assertThat(engineDescriptor.getDescendants().size()).isGreaterThan(150).as( "Too few test descriptors in classpath"); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains( uniqueIdForClass(ReflectionUtils.loadClass("DefaultPackageTestCase").get())).describedAs( "Failed to pick up DefaultPackageTestCase via classpath scanning"); assertThat(uniqueIds).contains(uniqueIdForClass(Class1WithTestCases.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(Class1WithTestCases.class, "test1()")); assertThat(uniqueIds).contains(uniqueIdForClass(Class2WithTestCases.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(Class2WithTestCases.class, "test2()")); } @Test void classpathResolution() throws Exception { Path classpath = Paths.get( DiscoverySelectorResolverTests.class.getProtectionDomain().getCodeSource().getLocation().toURI()); List<ClasspathRootSelector> selectors = selectClasspathRoots(singleton(classpath)); resolver.resolveSelectors(request().selectors(selectors).build(), engineDescriptor); // 150 is completely arbitrary. The actual number is likely much higher. assertThat(engineDescriptor.getDescendants().size()).isGreaterThan(150).as( "Too few test descriptors in classpath"); List<UniqueId> uniqueIds = uniqueIds(); assertTrue(uniqueIds().contains(uniqueIdForClass(ReflectionUtils.loadClass("DefaultPackageTestCase").get())), "Failed to pick up DefaultPackageTestCase via classpath scanning"); assertThat(uniqueIds).contains(uniqueIdForClass(Class1WithTestCases.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(Class1WithTestCases.class, "test1()")); assertThat(uniqueIds).contains(uniqueIdForClass(Class2WithTestCases.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(Class2WithTestCases.class, "test2()")); assertThat(uniqueIds).contains( uniqueIdForMethod(ClassWithStaticInnerTestCases.ShouldBeDiscovered.class, "test1()")); } @Test void classpathResolutionForJarFiles() throws Exception { URL jarUrl = getClass().getResource("/jupiter-testjar.jar"); Path path = Paths.get(jarUrl.toURI()); List<ClasspathRootSelector> selectors = selectClasspathRoots(singleton(path)); ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); try (URLClassLoader classLoader = new URLClassLoader(new URL[] { jarUrl })) { Thread.currentThread().setContextClassLoader(classLoader); resolver.resolveSelectors(request().selectors(selectors).build(), engineDescriptor); assertThat(uniqueIds()) // .contains(uniqueIdForTopLevelClass("com.example.project.FirstTest")) // .contains(uniqueIdForTopLevelClass("com.example.project.SecondTest")); } finally { Thread.currentThread().setContextClassLoader(originalClassLoader); } } @Test void nestedTestResolutionFromBaseClass() { ClassSelector selector = selectClass(TestCaseWithNesting.class); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); List<UniqueId> uniqueIds = uniqueIds(); assertEquals(6, uniqueIds.size()); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(TestCaseWithNesting.class, "testA()")); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.class, "testB()")); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class)); assertThat(uniqueIds).contains( uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class, "testC()")); } @Test void nestedTestResolutionFromNestedTestClass() { ClassSelector selector = selectClass(TestCaseWithNesting.NestedTestCase.class); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); List<UniqueId> uniqueIds = uniqueIds(); assertEquals(5, uniqueIds.size()); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.class)); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.class, "testB()")); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class)); assertThat(uniqueIds).contains( uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class, "testC()")); } @Test void nestedTestResolutionFromUniqueId() { UniqueIdSelector selector = selectUniqueId( uniqueIdForClass(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class).toString()); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); List<UniqueId> uniqueIds = uniqueIds(); assertEquals(4, uniqueIds.size()); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.class)); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.class)); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class)); assertThat(uniqueIds).contains( uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class, "testC()")); } @Test void doubleNestedTestResolutionFromClass() { ClassSelector selector = selectClass(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); List<UniqueId> uniqueIds = uniqueIds(); assertEquals(4, uniqueIds.size()); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.class)); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.class)); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class)); assertThat(uniqueIds).contains( uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class, "testC()")); } @Test void methodResolutionInDoubleNestedTestClass() throws NoSuchMethodException { MethodSelector selector = selectMethod(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class, TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class.getDeclaredMethod("testC")); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertEquals(4, engineDescriptor.getDescendants().size()); List<UniqueId> uniqueIds = uniqueIds(); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.class)); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.class)); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class)); assertThat(uniqueIds).contains( uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.DoubleNestedTestCase.class, "testC()")); } @Test void nestedTestResolutionFromUniqueIdToMethod() { UniqueIdSelector selector = selectUniqueId( uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.class, "testB()").toString()); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); List<UniqueId> uniqueIds = uniqueIds(); assertEquals(3, uniqueIds.size()); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.class)); assertThat(uniqueIds).contains(uniqueIdForClass(TestCaseWithNesting.NestedTestCase.class)); assertThat(uniqueIds).contains(uniqueIdForMethod(TestCaseWithNesting.NestedTestCase.class, "testB()")); } @Test void testTemplateMethodResolution() { ClassSelector selector = selectClass(TestClassWithTemplate.class); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertThat(engineDescriptor.getDescendants()).hasSize(2); assertThat(uniqueIds()).contains(uniqueIdForTestTemplateMethod(TestClassWithTemplate.class, "testTemplate()")); } @Test void resolvingTestTemplateInvocationByUniqueIdResolvesOnlyUpToParentTestTemplat() { UniqueIdSelector selector = selectUniqueId( uniqueIdForTestTemplateMethod(TestClassWithTemplate.class, "testTemplate()").append( TestTemplateInvocationTestDescriptor.SEGMENT_TYPE, "#1")); resolver.resolveSelectors(request().selectors(selector).build(), engineDescriptor); assertThat(engineDescriptor.getDescendants()).hasSize(2); assertThat(uniqueIds()).containsSequence(uniqueIdForClass(TestClassWithTemplate.class), uniqueIdForTestTemplateMethod(TestClassWithTemplate.class, "testTemplate()")); } private TestDescriptor descriptorByUniqueId(UniqueId uniqueId) { return engineDescriptor.getDescendants().stream().filter( d -> d.getUniqueId().equals(uniqueId)).findFirst().get(); } private List<UniqueId> uniqueIds() { return engineDescriptor.getDescendants().stream().map(TestDescriptor::getUniqueId).collect(Collectors.toList()); } } class MyTestClass { @Test void test1() { } @Test void test2() { } void notATest() { } @TestFactory Stream<DynamicTest> dynamicTest() { return new ArrayList<DynamicTest>().stream(); } } class YourTestClass { @Test void test3() { } @Test void test4() { } } class HerTestClass extends MyTestClass { @Test void test7(String param) { } } class OtherTestClass { static class NestedTestClass { @Test void test5() { } @Test void test6() { } } } class TestCaseWithNesting { @Test void testA() { } @Nested class NestedTestCase { @Test void testB() { } @Nested class DoubleNestedTestCase { @Test void testC() { } } } } class TestClassWithTemplate { @TestTemplate void testTemplate() { } }