diff --git a/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/IJUnitMethodTester.java b/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/IJUnitMethodTester.java index f787e26..c132bda 100644 --- a/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/IJUnitMethodTester.java +++ b/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/IJUnitMethodTester.java @@ -1,17 +1,29 @@ package org.eclipse.jdt.experimental.junit.codemining.tester; +import java.util.Arrays; +import java.util.Optional; + import org.eclipse.jdt.core.Flags; +import org.eclipse.jdt.core.IAnnotation; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.experimental.JavaCodeMiningPlugin; public interface IJUnitMethodTester { - public static boolean isTestMethod(IMethod method, boolean onlyPublicMethod, String[] annotations) { + public static boolean isTestMethod(IMethod method, boolean onlyPublicMethod, String[] annotationSignatures) { if (isMethod(method, onlyPublicMethod)) { - for (String annotation : annotations) { - if (method.getAnnotation(annotation).exists()) { - return true; + try { + Optional annotation = Arrays.stream(method.getAnnotations()) + .filter(a -> annotationSignatures[0].equals(a.getElementName())).findFirst(); + if(annotation.isPresent()) { + String[][] resolveType = method.getDeclaringType().resolveType(annotation.get().getElementName()); + if (resolveType.length > 0) { + return Arrays.equals(annotationSignatures, 1, annotationSignatures.length - 1, resolveType[0], 0, resolveType[0].length - 1); + } } + } catch (JavaModelException e) { + JavaCodeMiningPlugin.getDefault().getLog().error(e.getMessage(), e); } } return false; diff --git a/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit3MethodTester.java b/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit3MethodTester.java index f9b3bef..48404a2 100644 --- a/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit3MethodTester.java +++ b/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit3MethodTester.java @@ -1,6 +1,12 @@ package org.eclipse.jdt.experimental.junit.codemining.tester; +import java.util.stream.Stream; + +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.experimental.JavaCodeMiningPlugin; public class JUnit3MethodTester implements IJUnitMethodTester { @@ -8,7 +14,17 @@ public class JUnit3MethodTester implements IJUnitMethodTester { @Override public boolean isTestMethod(IMethod method) { - return IJUnitMethodTester.isMethod(method, true) && method.getElementName().startsWith("test"); + return IJUnitMethodTester.isMethod(method, true) && isTestClass(method.getDeclaringType()) + && method.getElementName().startsWith("test"); } + private boolean isTestClass(IType type) { + try { + return Stream.of(type.newSupertypeHierarchy(new NullProgressMonitor()).getAllSupertypes(type)) + .filter(t -> "junit.framework.TestCase".equals(t.getFullyQualifiedName())).findFirst().isPresent(); + } catch (JavaModelException e) { + JavaCodeMiningPlugin.getDefault().getLog().error("isTestClass check for JUnit3 failed.", e); + return false; + } + } } diff --git a/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit4MethodTester.java b/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit4MethodTester.java index bfa0438..48b0816 100644 --- a/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit4MethodTester.java +++ b/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit4MethodTester.java @@ -6,11 +6,13 @@ public class JUnit4MethodTester implements IJUnitMethodTester { public static final IJUnitMethodTester INSTANCE = new JUnit4MethodTester(); - private final String[] JUNIT_TEST_ANNOTATIONS = new String[] { "Test", "org.junit.Test" }; + private final String[][] JUNIT_TEST_ANNOTATIONS = new String[][] { { "Test", "org.junit", "Test" }, + { "org.junit.Test", "org.junit", "Test" } }; @Override public boolean isTestMethod(IMethod method) { - return IJUnitMethodTester.isTestMethod(method, true, JUNIT_TEST_ANNOTATIONS); + return IJUnitMethodTester.isTestMethod(method, true, JUNIT_TEST_ANNOTATIONS[0]) + || IJUnitMethodTester.isTestMethod(method, true, JUNIT_TEST_ANNOTATIONS[1]); } } diff --git a/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit5MethodTester.java b/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit5MethodTester.java index 8c9c67c..25693d2 100644 --- a/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit5MethodTester.java +++ b/org.eclipse.jdt.codemining/src/org/eclipse/jdt/experimental/junit/codemining/tester/JUnit5MethodTester.java @@ -6,11 +6,17 @@ public class JUnit5MethodTester implements IJUnitMethodTester { public static final IJUnitMethodTester INSTANCE = new JUnit5MethodTester(); - private final String[] JUNIT_TEST_ANNOTATIONS = new String[] { "Test", "org.junit.jupiter.api.Test", "ParameterizedTest", "org.junit.jupiter.params.ParameterizedTest" }; + private final String[][] JUNIT_TEST_ANNOTATIONS = new String[][] { { "Test", "org.junit.jupiter.api", "Test" }, + { "org.junit.jupiter.api.Test", "org.junit.jupiter.api", "Test" }, + { "ParameterizedTest", "org.junit.jupiter.params", "ParameterizedTest" }, + { "org.junit.jupiter.params.ParameterizedTest", "org.junit.jupiter.params", "ParameterizedTest" } }; @Override public boolean isTestMethod(IMethod method) { - return IJUnitMethodTester.isTestMethod(method, false, JUNIT_TEST_ANNOTATIONS); + return IJUnitMethodTester.isTestMethod(method, false, JUNIT_TEST_ANNOTATIONS[0]) + || IJUnitMethodTester.isTestMethod(method, false, JUNIT_TEST_ANNOTATIONS[1]) + || IJUnitMethodTester.isTestMethod(method, false, JUNIT_TEST_ANNOTATIONS[2]) + || IJUnitMethodTester.isTestMethod(method, false, JUNIT_TEST_ANNOTATIONS[3]); } } diff --git a/pom.xml b/pom.xml index 54ceba5..27e0cdf 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ photon p2 - http://download.eclipse.org/releases/photon/ + http://download.eclipse.org/releases/2020-06/ egit