From 973eced578c805040b4a06ca79e6145e791c066e Mon Sep 17 00:00:00 2001 From: Mehraz Ali Date: Thu, 5 Jan 2017 11:42:51 -0500 Subject: [PATCH] Allow directly running nested tests instead of running from parent level --- .../junit/runners/NestedRunner.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/junit-runners/src/main/java/com/nitorcreations/junit/runners/NestedRunner.java b/junit-runners/src/main/java/com/nitorcreations/junit/runners/NestedRunner.java index 4f569d9..e7e4271 100644 --- a/junit-runners/src/main/java/com/nitorcreations/junit/runners/NestedRunner.java +++ b/junit-runners/src/main/java/com/nitorcreations/junit/runners/NestedRunner.java @@ -15,6 +15,8 @@ */ package com.nitorcreations.junit.runners; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; @@ -48,6 +50,9 @@ public NestedRunner(Class testClass) throws InitializationError { public NestedRunner(Class testClass, NestedRunner parentRunner) throws InitializationError { super(testClass); + if (parentRunner == null && testClass.getDeclaringClass() != null) { + parentRunner = new NestedRunner(testClass.getEnclosingClass()); + } this.parentRunner = parentRunner; delegatedRunner = new NestedClassRunner(testClass); children.addAll(delegatedRunner.giveMeTheDamnChildren()); @@ -106,17 +111,31 @@ protected void runChild(Object child, RunNotifier notifier) { } private Object constructTestClass() throws Exception { - if (getTestClass().getOnlyConstructor().getParameterTypes().length == 1 && parentRunner != null) { + Constructor onlyConstructor = getTestClass().getOnlyConstructor(); + if (onlyConstructor.getParameterTypes().length == 1 && parentRunner != null) { Object parent = parentRunner.constructTestClass(); - Object newInstance = getTestClass().getOnlyConstructor().newInstance(parent); + Object newInstance = onlyConstructor.newInstance(parent); delegatedRunner.currentTestObject = newInstance; return newInstance; } - Object newInstance = getTestClass().getOnlyConstructor().newInstance(); + + Object newInstance = createNewInstance(onlyConstructor); delegatedRunner.currentTestObject = newInstance; return newInstance; } + private Object createNewInstance(Constructor classConstructor) throws InstantiationException, IllegalAccessException, InvocationTargetException { + if (classConstructor.getParameterTypes().length == 0) { + return classConstructor.newInstance(); + } + else if (classConstructor.getParameterTypes().length == 1) { + Class aClass = classConstructor.getParameterTypes()[0]; + return classConstructor.newInstance(createNewInstance(aClass.getConstructors()[0])); + } + + return null; + } + public List getBefores() { List befores = new ArrayList(); befores.addAll(getTestClass().getAnnotatedMethods(Before.class));