diff --git a/processor/src/test/java/org/mapstruct/ap/testutil/IssueKey.java b/processor/src/test/java/org/mapstruct/ap/testutil/IssueKey.java index 517236eda..2673efe3c 100644 --- a/processor/src/test/java/org/mapstruct/ap/testutil/IssueKey.java +++ b/processor/src/test/java/org/mapstruct/ap/testutil/IssueKey.java @@ -29,5 +29,11 @@ import java.lang.annotation.RetentionPolicy; */ @Retention(RetentionPolicy.SOURCE) public @interface IssueKey { + + /** + * The issue number. + * + * @return the issue number + */ String value(); } diff --git a/processor/src/test/java/org/mapstruct/ap/testutil/MapperTestBase.java b/processor/src/test/java/org/mapstruct/ap/testutil/MapperTestBase.java index 4d171229e..1f6257e50 100644 --- a/processor/src/test/java/org/mapstruct/ap/testutil/MapperTestBase.java +++ b/processor/src/test/java/org/mapstruct/ap/testutil/MapperTestBase.java @@ -45,9 +45,8 @@ import org.testng.annotations.BeforeMethod; import static org.fest.assertions.Assertions.assertThat; /** - * Base class for all mapper tests. Sub-classes must implement - * {@link #getTestClasses()} to return the classes to be compiled for a given - * test. + * Base class for all mapper tests. The classes to be compiled for a given test + * method must be specified via {@link WithClasses}. * * @author Gunnar Morling */ @@ -95,7 +94,7 @@ public abstract class MapperTestBase { @BeforeMethod public void generateMapperImplementation(Method testMethod) { diagnostics = new DiagnosticCollector(); - List sourceFiles = getSourceFiles( getTestClasses() ); + List sourceFiles = getSourceFiles( getTestClasses( testMethod ) ); boolean compilationSuccessful = compile( diagnostics, sourceFiles ); @@ -125,11 +124,24 @@ public abstract class MapperTestBase { /** * Returns the classes to be compiled for this test. * + * @param testMethod The test method of interest + * * @return A list containing the classes to be compiled for this test */ - private List> getTestClasses() { - WithClasses withClasses = this.getClass().getAnnotation( WithClasses.class ); - return withClasses != null ? Arrays.asList( withClasses.value() ) : Collections.>emptyList(); + private List> getTestClasses(Method testMethod) { + WithClasses withClasses = testMethod.getAnnotation( WithClasses.class ); + + if ( withClasses == null ) { + withClasses = this.getClass().getAnnotation( WithClasses.class ); + } + + if ( withClasses == null || withClasses.value().length == 0 ) { + throw new IllegalStateException( + "The classes to be compiled during the test must be specified via @WithClasses." + ); + } + + return Arrays.asList( withClasses.value() ); } private List getSourceFiles(List> classes) { diff --git a/processor/src/test/java/org/mapstruct/ap/testutil/WithClasses.java b/processor/src/test/java/org/mapstruct/ap/testutil/WithClasses.java index 2c4f58f56..8520fa278 100644 --- a/processor/src/test/java/org/mapstruct/ap/testutil/WithClasses.java +++ b/processor/src/test/java/org/mapstruct/ap/testutil/WithClasses.java @@ -18,13 +18,20 @@ */ package org.mapstruct.ap.testutil; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** + * Specifies the classes to compile during an annotation processor test. If + * given both on the class-level and the method-level for a given test, the + * settings on the method take precedence. + * * @author Gunnar Morling */ @Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.METHOD }) public @interface WithClasses { Class[] value(); }