diff options
author | Julien Herr <julien@herr.fr> | 2015-11-21 14:07:47 +0100 |
---|---|---|
committer | Julien Herr <julien@herr.fr> | 2015-11-21 22:39:22 +0100 |
commit | 648bfc7bd309bcd3ab6d123b48797b71b557127b (patch) | |
tree | af1a34f4a168ce9ae1768c8d1e0dc7280a27e65e /src/main/java | |
parent | 36dfb40f1200b21ab195392ef15660739859646e (diff) | |
download | testng-648bfc7bd309bcd3ab6d123b48797b71b557127b.tar.gz |
Fix #876: NPE when a factory method is not static
Diffstat (limited to 'src/main/java')
-rw-r--r-- | src/main/java/org/testng/internal/FactoryMethod.java | 13 | ||||
-rw-r--r-- | src/main/java/org/testng/internal/Utils.java | 2 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/main/java/org/testng/internal/FactoryMethod.java b/src/main/java/org/testng/internal/FactoryMethod.java index d599b25f..fb802871 100644 --- a/src/main/java/org/testng/internal/FactoryMethod.java +++ b/src/main/java/org/testng/internal/FactoryMethod.java @@ -1,5 +1,6 @@ package org.testng.internal; +import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -33,12 +34,22 @@ public class FactoryMethod extends BaseTestMethod { ITestContext testContext) { super(com.getName(), com, annotationFinder, instance); -// Utils.checkInstanceOrStatic(instance, method); + Utils.checkInstanceOrStatic(instance, com.getMethod()); Class<?> declaringClass = com.getDeclaringClass(); if (instance != null && ! declaringClass.isAssignableFrom(instance.getClass())) { throw new TestNGException("Mismatch between instance/method classes:" + instance.getClass() + " " + declaringClass); } + if (instance == null && com.getMethod() != null && !Modifier.isStatic(com.getMethod().getModifiers())) { + throw new TestNGException("An inner factory method MUST be static. But '" + com.getMethod().getName() + "' from '" + declaringClass.getName() + "' is not."); + } + if (com.getMethod() != null && !Modifier.isPublic(com.getMethod().getModifiers())) { + try { + com.getMethod().setAccessible(true); + } catch (SecurityException e) { + throw new TestNGException(e); + } + } m_instance = instance; m_xmlTest = xmlTest; diff --git a/src/main/java/org/testng/internal/Utils.java b/src/main/java/org/testng/internal/Utils.java index 741a812f..aa399b0c 100644 --- a/src/main/java/org/testng/internal/Utils.java +++ b/src/main/java/org/testng/internal/Utils.java @@ -796,7 +796,7 @@ public final class Utils { * Make sure that either we have an instance or if not, that the method is static */ public static void checkInstanceOrStatic(Object instance, Method method) { - if (instance == null && ! Modifier.isStatic(method.getModifiers())) { + if (instance == null && method != null && ! Modifier.isStatic(method.getModifiers())) { throw new TestNGException("Can't invoke " + method + ": either make it static or add " + "a no-args constructor to your class"); } |