junit3: suggest to search for inheritors for classes without default constructors

This commit is contained in:
Anna Kozlova
2015-07-21 10:38:38 +02:00
parent ddfe19af66
commit b445c8a7f7
6 changed files with 35 additions and 6 deletions
@@ -60,7 +60,12 @@ public class InheritorChooser {
final Runnable performRunnable,
final PsiMethod psiMethod,
final PsiClass containingClass) {
return runMethodInAbstractClass(context, performRunnable, psiMethod, containingClass, Conditions.<PsiClass>alwaysTrue());
return runMethodInAbstractClass(context, performRunnable, psiMethod, containingClass, new Condition<PsiClass>() {
@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<PsiClass> 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();
@@ -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<PsiClass> location = PsiLocation.fromPsiElement(aClass);
PsiClass testCaseClass = getTestCaseClassOrNull(location);
@@ -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<JUnitConfiguration> implements Cloneable {
@@ -88,4 +89,27 @@ public abstract class JUnitConfigurationProducer extends JavaRunConfigurationPro
}
return false;
}
protected Condition<PsiClass> getConditionToSearchForInheritors() {
return new Condition<PsiClass>() {
@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;
}
};
}
}
@@ -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);
}
}
@@ -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);
}
}
@@ -87,7 +87,7 @@ public class TestNGInClassConfigurationProducer extends TestNGConfigurationProdu
if (inheritorChooser.runMethodInAbstractClass(fromContext, performRunnable, psiMethod, containingClass, new Condition<PsiClass>() {
@Override
public boolean value(PsiClass aClass) {
return TestNGUtil.hasTest(aClass);
return aClass.hasModifierProperty(PsiModifier.ABSTRACT) && TestNGUtil.hasTest(aClass);
}
})) return;
}