From b445c8a7f739df399660b779a4ae507d2bcce526 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 21 Jul 2015 09:37:49 +0200 Subject: [PATCH] junit3: suggest to search for inheritors for classes without default constructors --- .../execution/junit/InheritorChooser.java | 9 +++++-- .../intellij/execution/junit/JUnitUtil.java | 2 +- .../junit/JUnitConfigurationProducer.java | 24 +++++++++++++++++++ .../junit/TestClassConfigurationProducer.java | 2 +- .../TestMethodConfigurationProducer.java | 2 +- .../TestNGInClassConfigurationProducer.java | 2 +- 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/junit/InheritorChooser.java b/java/execution/impl/src/com/intellij/execution/junit/InheritorChooser.java index fc0e65f9742b..2f538f46db98 100644 --- a/java/execution/impl/src/com/intellij/execution/junit/InheritorChooser.java +++ b/java/execution/impl/src/com/intellij/execution/junit/InheritorChooser.java @@ -60,7 +60,12 @@ public class InheritorChooser { final Runnable performRunnable, final PsiMethod psiMethod, final PsiClass containingClass) { - return runMethodInAbstractClass(context, performRunnable, psiMethod, containingClass, Conditions.alwaysTrue()); + return runMethodInAbstractClass(context, performRunnable, psiMethod, containingClass, new Condition() { + @Override + public boolean value(PsiClass psiClass) { + return psiClass.hasModifierProperty(PsiModifier.ABSTRACT); + } + }); } public boolean runMethodInAbstractClass(final ConfigurationContext context, @@ -68,7 +73,7 @@ public class InheritorChooser { final PsiMethod psiMethod, final PsiClass containingClass, final Condition acceptAbstractCondition) { - if (containingClass != null && containingClass.hasModifierProperty(PsiModifier.ABSTRACT) && acceptAbstractCondition.value(containingClass)) { + if (containingClass != null && acceptAbstractCondition.value(containingClass)) { final Location location = context.getLocation(); if (location instanceof MethodLocation) { final PsiClass aClass = ((MethodLocation)location).getContainingClass(); diff --git a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java index 193c8d2b6d8b..964c0b588992 100644 --- a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java +++ b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java @@ -93,7 +93,7 @@ public class JUnitUtil { return testCaseClass != null && psiMethod.getContainingClass().isInheritor(testCaseClass, true); } - private static boolean isTestCaseInheritor(final PsiClass aClass) { + public static boolean isTestCaseInheritor(final PsiClass aClass) { if (!aClass.isValid()) return false; Location location = PsiLocation.fromPsiElement(aClass); PsiClass testCaseClass = getTestCaseClassOrNull(location); diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java b/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java index 799250e78baa..c1a958d5ce5f 100644 --- a/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java +++ b/plugins/junit/src/com/intellij/execution/junit/JUnitConfigurationProducer.java @@ -27,6 +27,7 @@ import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.junit2.PsiMemberParameterizedLocation; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.util.Condition; import com.intellij.psi.*; public abstract class JUnitConfigurationProducer extends JavaRunConfigurationProducerBase implements Cloneable { @@ -88,4 +89,27 @@ public abstract class JUnitConfigurationProducer extends JavaRunConfigurationPro } return false; } + + protected Condition getConditionToSearchForInheritors() { + return new Condition() { + @Override + public boolean value(PsiClass psiClass) { + if (psiClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return true; + } + + if (JUnitUtil.isTestCaseInheritor(psiClass)) { + final PsiMethod[] constructors = psiClass.getConstructors(); + for (PsiMethod method : constructors) { + if (method.getParameterList().getParametersCount() == 0) { + return false; + } + } + return constructors.length != 0; + } + + return false; + } + }; + } } diff --git a/plugins/junit/src/com/intellij/execution/junit/TestClassConfigurationProducer.java b/plugins/junit/src/com/intellij/execution/junit/TestClassConfigurationProducer.java index e33e64701247..ae036f95c83e 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestClassConfigurationProducer.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestClassConfigurationProducer.java @@ -83,7 +83,7 @@ public class TestClassConfigurationProducer extends JUnitConfigurationProducer { super.runForClass(aClass, psiMethod, context, performRunnable); } }; - if (inheritorChooser.runMethodInAbstractClass(context, performRunnable, null, (PsiClass)fromContext.getSourceElement())) return; + if (inheritorChooser.runMethodInAbstractClass(context, performRunnable, null, (PsiClass)fromContext.getSourceElement(), getConditionToSearchForInheritors())) return; super.onFirstRun(fromContext, context, performRunnable); } } diff --git a/plugins/junit/src/com/intellij/execution/junit/TestMethodConfigurationProducer.java b/plugins/junit/src/com/intellij/execution/junit/TestMethodConfigurationProducer.java index 141818654c4f..c2e0e3118382 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestMethodConfigurationProducer.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestMethodConfigurationProducer.java @@ -97,7 +97,7 @@ public class TestMethodConfigurationProducer extends JUnitConfigurationProducer super.runForClass(aClass, psiMethod, context, performRunnable); } }; - if (inheritorChooser.runMethodInAbstractClass(context, performRunnable, psiMethod, containingClass)) return; + if (inheritorChooser.runMethodInAbstractClass(context, performRunnable, psiMethod, containingClass, getConditionToSearchForInheritors())) return; super.onFirstRun(fromContext, context, performRunnable); } } diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGInClassConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGInClassConfigurationProducer.java index 497967e352cf..d30386d78f0c 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGInClassConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGInClassConfigurationProducer.java @@ -87,7 +87,7 @@ public class TestNGInClassConfigurationProducer extends TestNGConfigurationProdu if (inheritorChooser.runMethodInAbstractClass(fromContext, performRunnable, psiMethod, containingClass, new Condition() { @Override public boolean value(PsiClass aClass) { - return TestNGUtil.hasTest(aClass); + return aClass.hasModifierProperty(PsiModifier.ABSTRACT) && TestNGUtil.hasTest(aClass); } })) return; }