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 990fea7bd281..d63f2bc7bd4f 100644 --- a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java +++ b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java @@ -120,6 +120,7 @@ public class JUnitUtil { if (psiMethod.getParameterList().getParametersCount() > 0) return false; if (psiMethod.hasModifierProperty(PsiModifier.STATIC) && SUITE_METHOD_NAME.equals(psiMethod.getName())) return false; if (!psiMethod.getName().startsWith("test")) return false; + if (psiMethod.hasModifierProperty(PsiModifier.STATIC)) return false; PsiClass testCaseClass = getTestCaseClassOrNull(location); return testCaseClass != null && psiMethod.getContainingClass().isInheritor(testCaseClass, true) && PsiType.VOID.equals(psiMethod.getReturnType()); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index ff0227571fed..6522283735f2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -2059,8 +2059,8 @@ class.with.only.private.constructors.problem.descriptor=Class #ref property.value.set.to.itself.display.name=Property value set to itself equals.with.itself.display.name='equals()' called on itself equals.with.itself.problem.descriptor=#ref() called on itself -junit4.method.naming.convention.display.name=JUnit 4 test method naming convention -junit4.method.naming.convention.element.description=JUnit 4 test method +junit4.method.naming.convention.display.name=JUnit 4+ test method naming convention +junit4.method.naming.convention.element.description=JUnit 4+ test method junit3.method.naming.convention.display.name=JUnit 3 test method naming convention junit3.method.naming.convention.element.description=JUnit 3 test method introduce.holder.class.quickfix=Introduce holder class diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnit4MethodNamingConventionInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnit4MethodNamingConventionInspectionBase.java index 07d5ecfb455d..459d63cbcf01 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnit4MethodNamingConventionInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnit4MethodNamingConventionInspectionBase.java @@ -15,8 +15,11 @@ */ package com.siyeh.ig.junit; +import com.intellij.codeInsight.TestFrameworks; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiIdentifier; import com.intellij.psi.PsiMethod; +import com.intellij.testIntegration.TestFramework; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.naming.ConventionInspection; @@ -68,7 +71,7 @@ public class JUnit4MethodNamingConventionInspectionBase extends ConventionInspec @Override public void visitMethod(PsiMethod method) { super.visitMethod(method); - if (!TestUtils.isJUnit4TestMethod(method) || !TestUtils.isRunnable(method)) { + if (!TestUtils.isAnnotatedTestMethod(method)) { return; } final PsiIdentifier nameIdentifier = method.getNameIdentifier(); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspectionBase.java index d44126fd027c..d64e43fd7a60 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspectionBase.java @@ -15,8 +15,10 @@ */ package com.siyeh.ig.junit; +import com.intellij.codeInsight.TestFrameworks; import com.intellij.psi.*; import com.intellij.psi.util.InheritanceUtil; +import com.intellij.testIntegration.TestFramework; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.naming.ConventionInspection; @@ -82,12 +84,12 @@ public class JUnitTestClassNamingConventionInspectionBase extends ConventionInsp if (aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { return; } - if (!InheritanceUtil.isInheritor(aClass, - JUnitCommonClassNames.JUNIT_FRAMEWORK_TEST_CASE)) { - if (!hasJUnit4TestMethods(aClass)) { - return; - } + + final TestFramework framework = TestFrameworks.detectFramework(aClass); + if (framework == null || !framework.getName().startsWith("JUnit") || !framework.isTestClass(aClass)) { + return; } + final String name = aClass.getName(); if (name == null) { return; @@ -107,19 +109,5 @@ public class JUnitTestClassNamingConventionInspectionBase extends ConventionInsp registerClassError(aClass, name); } } - - private boolean hasJUnit4TestMethods(@NotNull PsiClass aClass) { - //use this if this method turns out to have bad performance: - //if (!TestUtils.isTest(aClass)) { - // return false; - //} - final PsiMethod[] methods = aClass.getMethods(); - for (PsiMethod method : methods) { - if (TestUtils.isJUnit4TestMethod(method)) { - return true; - } - } - return false; - } } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/TestMethodInProductCodeInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/TestMethodInProductCodeInspection.java index ace8cd165d8f..f885a677f53f 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/TestMethodInProductCodeInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/TestMethodInProductCodeInspection.java @@ -57,7 +57,7 @@ public class TestMethodInProductCodeInspection extends BaseInspection { public void visitMethod(PsiMethod method) { final PsiClass containingClass = method.getContainingClass(); if (TestUtils.isInTestSourceContent(containingClass) || - !TestUtils.isJUnit4TestMethod(method)) { + !TestUtils.isAnnotatedTestMethod(method)) { return; } registerMethodError(method); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/InstanceMethodNamingConventionInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/InstanceMethodNamingConventionInspectionBase.java index 85fe6d20e8ca..82cd4f109dd8 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/InstanceMethodNamingConventionInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/naming/InstanceMethodNamingConventionInspectionBase.java @@ -93,7 +93,7 @@ public class InstanceMethodNamingConventionInspectionBase extends ConventionInsp return; } if (TestUtils.isRunnable(method)) { - if (TestUtils.isJUnit4TestMethod(method) && isInspectionEnabled("JUnit4MethodNamingConvention", method)) { + if (TestUtils.isAnnotatedTestMethod(method) && isInspectionEnabled("JUnit4MethodNamingConvention", method)) { return; } if (TestUtils.isJUnit3TestMethod(method) && isInspectionEnabled("JUnit3MethodNamingConvention", method)) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/TestUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/TestUtils.java index eadaa038c86e..68c85078e271 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/TestUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/TestUtils.java @@ -24,6 +24,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.testIntegration.TestFramework; import com.siyeh.ig.junit.JUnitCommonClassNames; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -62,7 +63,11 @@ public class TestUtils { } public static boolean isJUnitTestMethod(@Nullable PsiMethod method) { - return isRunnable(method) && (isJUnit3TestMethod(method) || isJUnit4TestMethod(method)); + if (method == null) return false; + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) return false; + final TestFramework framework = TestFrameworks.detectFramework(containingClass); + return framework != null && framework.getName().startsWith("JUnit") && framework.isTestMethod(method); } public static boolean isRunnable(PsiMethod method) { @@ -99,6 +104,21 @@ public class TestUtils { return method != null && AnnotationUtil.isAnnotated(method, "org.junit.Test", true); } + public static boolean isAnnotatedTestMethod(@Nullable PsiMethod method) { + if (method == null) return false; + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) return false; + final TestFramework testFramework = TestFrameworks.detectFramework(containingClass); + if (testFramework == null) return false; + if (testFramework.isTestMethod(method)) { + final String testFrameworkName = testFramework.getName(); + return testFrameworkName.equals("JUnit4") || testFrameworkName.equals("JUnit5"); + } + return false; + } + + + public static boolean isJUnitTestClass(@Nullable PsiClass targetClass) { return targetClass != null && InheritanceUtil.isInheritor(targetClass, JUnitCommonClassNames.JUNIT_FRAMEWORK_TEST_CASE); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspection.java index 59d5d2a62d9b..b6922df84944 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/junit/JUnitTestClassNamingConventionInspection.java @@ -18,8 +18,7 @@ package com.siyeh.ig.junit; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.fixes.RenameFix; -public class JUnitTestClassNamingConventionInspection - extends JUnitTestClassNamingConventionInspectionBase { +public class JUnitTestClassNamingConventionInspection extends JUnitTestClassNamingConventionInspectionBase { @Override protected InspectionGadgetsFix buildFix(Object... infos) { diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/JUnit4MethodNamingConvention.html b/plugins/InspectionGadgets/src/inspectionDescriptions/JUnit4MethodNamingConvention.html index b2f7c7986a58..213d1d6a20f7 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/JUnit4MethodNamingConvention.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/JUnit4MethodNamingConvention.html @@ -1,11 +1,11 @@ -Reports JUnit 4 test methods whose names are either too short, too long, or do not follow the specified regular expression pattern. +Reports JUnit 4+ test methods whose names are either too short, too long, or do not follow the specified regular expression pattern. When this inspection is enabled, the Instance method naming convention inspection -will ignore JUnit 4 test methods automatically. +will ignore JUnit 4+ test methods automatically.

-Use the fields below to specify minimum length, maximum length and regular expression expected for JUnit 4 test method names. +Use the fields below to specify minimum length, maximum length and regular expression expected for JUnit 4+ test method names. Specify 0 to not check the length of names. Regular expressions are in standard java.util.regex format.

diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/TestMethodInProductCode.html b/plugins/InspectionGadgets/src/inspectionDescriptions/TestMethodInProductCode.html index deb66cd95ef4..767453325178 100644 --- a/plugins/InspectionGadgets/src/inspectionDescriptions/TestMethodInProductCode.html +++ b/plugins/InspectionGadgets/src/inspectionDescriptions/TestMethodInProductCode.html @@ -1,6 +1,6 @@ -Reports JUnit 4.0 @Test methods in product source trees. +Reports JUnit 4+ @Test methods in product source trees. This most likely indicates programmer error, and can result in test code being shipped into production. diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/junit/junit4_method_naming_convention/JUnit4MethodNamingConvention.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/junit/junit4_method_naming_convention/JUnit4MethodNamingConvention.java index 69379a9abb87..4f23a659ba16 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/junit/junit4_method_naming_convention/JUnit4MethodNamingConvention.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/junit/junit4_method_naming_convention/JUnit4MethodNamingConvention.java @@ -3,13 +3,13 @@ import org.junit.Test; public class JUnit4MethodNamingConvention { @Test - public void a() {} + public void a() {} @Test - public void abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz() {} + public void abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz() {} @Test - public void more$$$() {} + public void more$$$() {} @Test public void assure_foo_is_never_null() {}