crizzis commented on a change in pull request #487: URL: https://github.com/apache/maven-surefire/pull/487#discussion_r824921536
########## File path: surefire-providers/surefire-junit-platform/pom.xml ########## @@ -136,6 +136,47 @@ </includes> </configuration> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <id>api-jar</id> + <phase>package</phase> + <goals> + <goal>jar</goal> + </goals> + <configuration> + <classifier>api</classifier> Review comment: > Can you explain how the customer would implement the interface TestSelectorFactory you have introduced? What types of sources can be filtered and how they can be configured? Absolutely. Here is my implementation for ArchUnit's [`FieldSource`](https://github.com/TNG/ArchUnit/blob/2f3ff7dccbe3e3d8900604801fd545dd0c2e70d8/archunit-junit/junit5/engine-api/src/main/java/com/tngtech/archunit/junit/FieldSource.java): ``` package com.tngtech.archunit.junit.surefire; import com.tngtech.archunit.junit.FieldSource; import org.apache.maven.surefire.junitplatform.TestSelectorFactory; import org.junit.platform.engine.TestSource; public class FieldSelectorFactory implements TestSelectorFactory { @Override public boolean supports(TestSource testSource) { return testSource instanceof FieldSource; } @Override public String getContainerName(TestSource testSource) { return ((FieldSource) testSource).getClassName(); } @Override public String getSelectorName(TestSource testSource) { return ((FieldSource) testSource).getFieldName(); } } ``` It solves the problem of adding support for applying the same filtering logic Surefire now applies to methods, to other test sources (`FieldSource` in this case). In case you're unfamiliar with ArchUnit, here's what an ArchUnit test might look like: ``` @AnalyzeClasses(packages = "com.tngtech.archunit.example.layers") public class CodingRulesTest { @ArchTest private final ArchRule loggers_should_be_private_static_final = fields().that().haveRawType(Logger.class) .should().bePrivate() .andShould().beStatic() .andShould().beFinal() .because("we agreed on this convention"); } ``` As you can see, test cases are represented by *fields*, and not *methods*. This is also why the default Surefire `include / exclude` filters do not work. > JUnit5 SPI do not exist with same purpose? Yes, of course it exists, and that's exactly what ArchUnit does under the hood. There's no way to influence Surefire filtering logic from inside a JUnit extension, though. I've already verified providing this implementation of the new SPI in ArchUnit solves [the linked ArchUnit issue](https://github.com/TNG/ArchUnit/issues/641) for Surefire. I'm now about to suggest similar extensibility to other build tools. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@maven.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org