aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJulien Herr <julien@herr.fr>2015-11-21 17:49:42 +0100
committerJulien Herr <julien@herr.fr>2015-11-21 22:39:34 +0100
commitfefedec34706e40ff2bf780bff7716fca29daaab (patch)
treea35983b00bb5689dab4815a572fc853dd9187997 /src
parent648bfc7bd309bcd3ab6d123b48797b71b557127b (diff)
downloadtestng-fefedec34706e40ff2bf780bff7716fca29daaab.tar.gz
A factory method may not be public
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/testng/internal/ClassHelper.java6
-rw-r--r--src/main/java/org/testng/internal/TestNGClassFinder.java8
-rw-r--r--src/test/java/test/factory/FactoryIntegrationTest.java12
-rw-r--r--src/test/java/test/factory/NonPublicFactoryMethodSample.java14
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)
+ };
+ }
+}