mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
testng: run test method of an abstract class in inheritors (IDEA-53111)
This commit is contained in:
@@ -370,6 +370,7 @@ public class JUnitConfiguration extends ModuleBasedConfiguration<JavaRunConfigur
|
||||
myData.setPatterns(patterns);
|
||||
myData.METHOD_NAME = method.getName();
|
||||
myData.TEST_OBJECT = TEST_PATTERN;
|
||||
setGeneratedName();
|
||||
}
|
||||
|
||||
public static class Data implements Cloneable {
|
||||
|
||||
+25
-15
@@ -346,20 +346,7 @@ public class SearchingForTestsTask extends Task.Backgroundable {
|
||||
)) {
|
||||
throw new CantRunException("Cannot test anonymous or local class \"" + data.getMainClassName() + '\"');
|
||||
}
|
||||
final PsiMethod[] methods = ApplicationManager.getApplication().runReadAction(
|
||||
new Computable<PsiMethod[]>() {
|
||||
public PsiMethod[] compute() {
|
||||
return psiClass.findMethodsByName(data.getMethodName(), true);
|
||||
}
|
||||
}
|
||||
);
|
||||
calculateDependencies(methods, classes, psiClass);
|
||||
Collection<PsiMethod> psiMethods = classes.get(psiClass);
|
||||
if (psiMethods == null) {
|
||||
psiMethods = new LinkedHashSet<PsiMethod>();
|
||||
classes.put(psiClass, psiMethods);
|
||||
}
|
||||
ContainerUtil.addAll(psiMethods, methods);
|
||||
collectTestMethods(classes, psiClass, data.getMethodName());
|
||||
}
|
||||
else if (data.TEST_OBJECT.equals(TestType.GROUP.getType())) {
|
||||
//for a group, we include all classes
|
||||
@@ -372,6 +359,7 @@ public class SearchingForTestsTask extends Task.Backgroundable {
|
||||
}
|
||||
}
|
||||
else if (data.TEST_OBJECT.equals(TestType.PATTERN.getType())) {
|
||||
final String methodName = data.getMethodName();
|
||||
for (final String className : data.getPatterns()) {
|
||||
final PsiClass psiClass = ApplicationManager.getApplication().runReadAction(new Computable<PsiClass>() {
|
||||
@Nullable
|
||||
@@ -389,7 +377,12 @@ public class SearchingForTestsTask extends Task.Backgroundable {
|
||||
return TestNGUtil.hasTest(psiClass);
|
||||
}
|
||||
})) {
|
||||
calculateDependencies(null, classes, psiClass);
|
||||
if (StringUtil.isEmpty(methodName)) {
|
||||
calculateDependencies(null, classes, psiClass);
|
||||
}
|
||||
else {
|
||||
collectTestMethods(classes, psiClass, methodName);
|
||||
}
|
||||
} else {
|
||||
throw new CantRunException("No tests found in class " + className);
|
||||
}
|
||||
@@ -397,6 +390,23 @@ public class SearchingForTestsTask extends Task.Backgroundable {
|
||||
}
|
||||
}
|
||||
|
||||
private void collectTestMethods(Map<PsiClass, Collection<PsiMethod>> classes, final PsiClass psiClass, final String methodName) {
|
||||
final PsiMethod[] methods = ApplicationManager.getApplication().runReadAction(
|
||||
new Computable<PsiMethod[]>() {
|
||||
public PsiMethod[] compute() {
|
||||
return psiClass.findMethodsByName(methodName, true);
|
||||
}
|
||||
}
|
||||
);
|
||||
calculateDependencies(methods, classes, psiClass);
|
||||
Collection<PsiMethod> psiMethods = classes.get(psiClass);
|
||||
if (psiMethods == null) {
|
||||
psiMethods = new LinkedHashSet<PsiMethod>();
|
||||
classes.put(psiClass, psiMethods);
|
||||
}
|
||||
ContainerUtil.addAll(psiMethods, methods);
|
||||
}
|
||||
|
||||
private Map<String, String> buildTestParameters() {
|
||||
Map<String, String> testParams = new HashMap<String, String>();
|
||||
|
||||
|
||||
@@ -256,6 +256,18 @@ public class TestNGConfiguration extends ModuleBasedConfiguration<JavaRunConfigu
|
||||
setModule(data.setTestMethod(location));
|
||||
setGeneratedName();
|
||||
}
|
||||
|
||||
|
||||
public void bePatternConfiguration(List<PsiClass> classes, PsiMethod method) {
|
||||
Set<String> patterns = new HashSet<String>();
|
||||
for (PsiClass pattern : classes) {
|
||||
patterns.add(pattern.getQualifiedName());
|
||||
}
|
||||
data.setPatterns(patterns);
|
||||
data.METHOD_NAME = method.getName();
|
||||
data.TEST_OBJECT = TestType.PATTERN.getType();
|
||||
setGeneratedName();
|
||||
}
|
||||
|
||||
public void setGeneratedName() {
|
||||
setName(getGeneratedName());
|
||||
|
||||
+33
-1
@@ -22,6 +22,8 @@ package com.theoryinpractice.testng.configuration;
|
||||
|
||||
import com.intellij.execution.*;
|
||||
import com.intellij.execution.actions.ConfigurationContext;
|
||||
import com.intellij.execution.junit.InheritorChooser;
|
||||
import com.intellij.execution.junit2.info.MethodLocation;
|
||||
import com.intellij.openapi.actionSystem.LangDataKeys;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
@@ -31,6 +33,8 @@ import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.theoryinpractice.testng.util.TestNGUtil;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class TestNGInClassConfigurationProducer extends TestNGConfigurationProducer{
|
||||
private PsiElement myPsiElement = null;
|
||||
|
||||
@@ -65,7 +69,7 @@ public class TestNGInClassConfigurationProducer extends TestNGConfigurationProdu
|
||||
}
|
||||
element = element.getParent();
|
||||
}
|
||||
if (psiClass == null || !PsiClassUtil.isRunnableClass(psiClass, true) || !TestNGUtil.hasTest(psiClass)) return null;
|
||||
if (psiClass == null || !PsiClassUtil.isRunnableClass(psiClass, true, false) || !TestNGUtil.hasTest(psiClass)) return null;
|
||||
|
||||
myPsiElement = psiClass;
|
||||
final Project project = location.getProject();
|
||||
@@ -90,4 +94,32 @@ public class TestNGInClassConfigurationProducer extends TestNGConfigurationProdu
|
||||
public int compareTo(Object o) {
|
||||
return PREFERED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void perform(final ConfigurationContext context, final Runnable performRunnable) {
|
||||
if (myPsiElement instanceof PsiMethod) {
|
||||
final PsiMethod psiMethod = (PsiMethod)myPsiElement;
|
||||
final PsiClass containingClass = psiMethod.getContainingClass();
|
||||
final InheritorChooser inheritorChooser = new InheritorChooser() {
|
||||
@Override
|
||||
protected void runForClasses(List<PsiClass> classes, PsiMethod method, ConfigurationContext context, Runnable performRunnable) {
|
||||
((TestNGConfiguration)context.getConfiguration().getConfiguration()).bePatternConfiguration(classes, method);
|
||||
super.runForClasses(classes, method, context, performRunnable);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void runForClass(PsiClass aClass,
|
||||
PsiMethod psiMethod,
|
||||
ConfigurationContext context,
|
||||
Runnable performRunnable) {
|
||||
final Project project = psiMethod.getProject();
|
||||
final MethodLocation methodLocation = new MethodLocation(project, psiMethod, PsiLocation.fromPsiElement(aClass));
|
||||
((TestNGConfiguration)context.getConfiguration().getConfiguration()).setMethodConfiguration(methodLocation);
|
||||
super.runForClass(aClass, psiMethod, context, performRunnable);
|
||||
}
|
||||
};
|
||||
if (inheritorChooser.runMethodInAbstractClass(context, performRunnable, psiMethod, containingClass)) return;
|
||||
}
|
||||
super.perform(context, performRunnable);
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import com.intellij.execution.JavaExecutionUtil;
|
||||
import com.intellij.execution.Location;
|
||||
import com.intellij.execution.configurations.JavaRunConfigurationModule;
|
||||
import com.intellij.execution.junit.JUnitUtil;
|
||||
import com.intellij.execution.junit2.info.MethodLocation;
|
||||
import com.intellij.execution.testframework.TestSearchScope;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
@@ -210,7 +211,7 @@ public class TestData implements Cloneable
|
||||
final PsiMethod method = location.getPsiElement();
|
||||
METHOD_NAME = method.getName();
|
||||
TEST_OBJECT = TestType.METHOD.getType();
|
||||
return setMainClass(method.getContainingClass());
|
||||
return setMainClass(location instanceof MethodLocation ? ((MethodLocation)location).getContainingClass() : method.getContainingClass());
|
||||
}
|
||||
|
||||
public Module setPackage(PsiPackage pkg) {
|
||||
|
||||
Reference in New Issue
Block a user