diff options
author | Julien Herr <julien@herr.fr> | 2015-11-21 17:49:42 +0100 |
---|---|---|
committer | Julien Herr <julien@herr.fr> | 2015-11-21 22:39:34 +0100 |
commit | fefedec34706e40ff2bf780bff7716fca29daaab (patch) | |
tree | a35983b00bb5689dab4815a572fc853dd9187997 /src | |
parent | 648bfc7bd309bcd3ab6d123b48797b71b557127b (diff) | |
download | testng-fefedec34706e40ff2bf780bff7716fca29daaab.tar.gz |
A factory method may not be public
Diffstat (limited to 'src')
4 files changed, 33 insertions, 7 deletions
diff --git a/src/main/java/org/testng/internal/ClassHelper.java b/src/main/java/org/testng/internal/ClassHelper.java index ac10ec0f..5b854a04 100644 --- a/src/main/java/org/testng/internal/ClassHelper.java +++ b/src/main/java/org/testng/internal/ClassHelper.java @@ -132,14 +132,12 @@ public final class ClassHelper { * @param finder The finder (JDK 1.4 or JDK 5.0+) use to search for the annotation. * * @return the @Factory <CODE>method</CODE> or null - * - * FIXME: @Factory method must be public! */ public static ConstructorOrMethod findDeclaredFactoryMethod(Class<?> cls, IAnnotationFinder finder) { ConstructorOrMethod result = null; - for (Method method : cls.getMethods()) { + for (Method method : getAvailableMethods(cls)) { IFactoryAnnotation f = finder.findAnnotation(method, IFactoryAnnotation.class); if (null != f) { @@ -183,7 +181,7 @@ public final class ClassHelper { methods.addAll(Arrays.asList(clazz.getDeclaredMethods())); Class<?> parent = clazz.getSuperclass(); - while (Object.class != parent) { + while (null != parent) { methods.addAll(extractMethods(clazz, parent, methods)); parent = parent.getSuperclass(); } diff --git a/src/main/java/org/testng/internal/TestNGClassFinder.java b/src/main/java/org/testng/internal/TestNGClassFinder.java index 8ccbe423..8920c7dd 100644 --- a/src/main/java/org/testng/internal/TestNGClassFinder.java +++ b/src/main/java/org/testng/internal/TestNGClassFinder.java @@ -20,6 +20,8 @@ import org.testng.internal.annotations.IAnnotationFinder; import org.testng.xml.XmlClass; import org.testng.xml.XmlTest; +import static org.testng.internal.ClassHelper.getAvailableMethods; + /** * This class creates an ITestClass from a test class. * @@ -218,16 +220,16 @@ public class TestNGClassFinder extends BaseClassFinder { * @return true if this class contains TestNG annotations (either on itself * or on a superclass). */ - public static boolean isTestNGClass(Class c, IAnnotationFinder annotationFinder) { + public static boolean isTestNGClass(Class<?> c, IAnnotationFinder annotationFinder) { Class[] allAnnotations= AnnotationHelper.getAllAnnotations(); - Class cls = c; + Class<?> cls = c; try { for(Class annotation : allAnnotations) { for (cls = c; cls != null; cls = cls.getSuperclass()) { // Try on the methods - for (Method m : cls.getMethods()) { + for (Method m : getAvailableMethods(cls)) { IAnnotation ma= annotationFinder.findAnnotation(m, annotation); if(null != ma) { return true; diff --git a/src/test/java/test/factory/FactoryIntegrationTest.java b/src/test/java/test/factory/FactoryIntegrationTest.java index 169bdf00..a729f4cf 100644 --- a/src/test/java/test/factory/FactoryIntegrationTest.java +++ b/src/test/java/test/factory/FactoryIntegrationTest.java @@ -1,5 +1,6 @@ package test.factory; +import org.testng.Assert; import org.testng.TestListenerAdapter; import org.testng.TestNG; import org.testng.TestNGException; @@ -24,4 +25,15 @@ public class FactoryIntegrationTest extends SimpleBaseTest { assertThat(e).hasMessage("\nCan't invoke public java.lang.Object[] test.factory.GitHub876Sample.createInstances(): either make it static or add a no-args constructor to your class"); } } + + @Test + public void testNonPublicFactoryMethodShouldWork() { + TestNG tng = create(NonPublicFactoryMethodSample.class); + TestListenerAdapter tla = new TestListenerAdapter(); + tng.addListener(tla); + + tng.run(); + + Assert.assertEquals(tla.getPassedTests().size(), 2); + } } diff --git a/src/test/java/test/factory/NonPublicFactoryMethodSample.java b/src/test/java/test/factory/NonPublicFactoryMethodSample.java new file mode 100644 index 00000000..7feb6ef4 --- /dev/null +++ b/src/test/java/test/factory/NonPublicFactoryMethodSample.java @@ -0,0 +1,14 @@ +package test.factory; + +import org.testng.annotations.Factory; + +public class NonPublicFactoryMethodSample { + + @Factory + private Object[] createInstances() { + return new Object[] { + new BaseFactory(42), + new BaseFactory(43) + }; + } +} |