Add support for renaming setup and teardown methods

This commit is contained in:
Rick Ossendrijver
2021-12-25 14:56:42 +01:00
parent 00012c6aa8
commit 4974f5afb4
2 changed files with 84 additions and 20 deletions

View File

@@ -7,6 +7,7 @@ import static com.google.errorprone.matchers.Matchers.isType;
import static java.util.function.Predicate.not;
import com.google.auto.service.AutoService;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.errorprone.BugPattern;
import com.google.errorprone.VisitorState;
@@ -22,6 +23,7 @@ import com.google.errorprone.util.ASTHelpers;
import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.MethodTree;
import com.sun.tools.javac.code.Symbol;
import java.util.Objects;
import java.util.Optional;
import javax.lang.model.element.Modifier;
@@ -59,6 +61,13 @@ public final class JUnitMethodDeclarationCheck extends BugChecker implements Met
isType("org.junit.jupiter.api.AfterEach"),
isType("org.junit.jupiter.api.BeforeAll"),
isType("org.junit.jupiter.api.BeforeEach")));
private static final ImmutableMap<String, String> REPLACEMENTS =
ImmutableMap.<String, String>builder()
.put("org.junit.jupiter.api.AfterAll", "afterAll")
.put("org.junit.jupiter.api.AfterEach", "tearDown")
.put("org.junit.jupiter.api.BeforeAll", "beforeAll")
.put("org.junit.jupiter.api.BeforeEach", "setUp")
.build();
@Override
public Description matchMethod(MethodTree tree, VisitorState state) {
@@ -83,9 +92,32 @@ public final class JUnitMethodDeclarationCheck extends BugChecker implements Met
tryCanonicalizeMethodName(tree, state).ifPresent(builder::merge);
}
if (SETUP_OR_TEARDOWN_METHOD.matches(tree, state)) {
tryCanonicalizeSetupOrTeardownMethod(tree, state).ifPresent(builder::merge);
}
return builder.isEmpty() ? Description.NO_MATCH : describeMatch(tree, builder.build());
}
private static Optional<SuggestedFix> tryCanonicalizeSetupOrTeardownMethod(
MethodTree tree, VisitorState state) {
Symbol.MethodSymbol symbol = ASTHelpers.getSymbol(tree);
return symbol.getAnnotationMirrors().stream()
.map(compound -> compound.getAnnotationType().toString())
.filter(REPLACEMENTS::containsKey)
.filter(
e ->
!symbol
.getSimpleName()
.toString()
.startsWith(
Objects.requireNonNull(
REPLACEMENTS.get(e)))) // , tree.getName().toString()))
.findFirst()
.map(e -> SuggestedFixes.renameMethod(tree, REPLACEMENTS.get(e), state));
}
private static Optional<SuggestedFix> tryCanonicalizeMethodName(
MethodTree tree, VisitorState state) {
return Optional.ofNullable(ASTHelpers.getSymbol(tree))

View File

@@ -24,15 +24,15 @@ public final class JUnitMethodDeclarationCheckTest {
"import org.junit.jupiter.params.ParameterizedTest;",
"",
"class A {",
" @BeforeAll void setUp1() {}",
" @BeforeAll void beforeAll1() {}",
" // BUG: Diagnostic contains:",
" @BeforeAll public void setUp2() {}",
" @BeforeAll public void beforeAll2() {}",
" // BUG: Diagnostic contains:",
" @BeforeAll protected void setUp3() {}",
" @BeforeAll protected void beforeAll3() {}",
" // BUG: Diagnostic contains:",
" @BeforeAll private void setUp4() {}",
" @BeforeAll private void beforeAll4() {}",
"",
" @BeforeEach void setup5() {}",
" @BeforeEach void setUp5() {}",
" // BUG: Diagnostic contains:",
" @BeforeEach public void setUp6() {}",
" // BUG: Diagnostic contains:",
@@ -48,13 +48,13 @@ public final class JUnitMethodDeclarationCheckTest {
" // BUG: Diagnostic contains:",
" @AfterEach private void tearDown4() {}",
"",
" @AfterAll void tearDown5() {}",
" @AfterAll void afterAll5() {}",
" // BUG: Diagnostic contains:",
" @AfterAll public void tearDown6() {}",
" @AfterAll public void afterAll6() {}",
" // BUG: Diagnostic contains:",
" @AfterAll protected void tearDown7() {}",
" @AfterAll protected void afterAll7() {}",
" // BUG: Diagnostic contains:",
" @AfterAll private void tearDown8() {}",
" @AfterAll private void afterAll8() {}",
"",
" @Test void method1() {}",
" // BUG: Diagnostic contains:",
@@ -92,11 +92,11 @@ public final class JUnitMethodDeclarationCheckTest {
"import org.junit.jupiter.params.ParameterizedTest;",
"",
"class B extends A {",
" @Override @BeforeAll void setUp1() {}",
" @Override @BeforeAll public void setUp2() {}",
" @Override @BeforeAll protected void setUp3() {}",
" @Override @BeforeAll void beforeAll1() {}",
" @Override @BeforeAll public void beforeAll2() {}",
" @Override @BeforeAll protected void beforeAll3() {}",
"",
" @Override @BeforeEach void setup5() {}",
" @Override @BeforeEach void setUp5() {}",
" @Override @BeforeEach public void setUp6() {}",
" @Override @BeforeEach protected void setUp7() {}",
"",
@@ -104,9 +104,9 @@ public final class JUnitMethodDeclarationCheckTest {
" @Override @AfterEach public void tearDown2() {}",
" @Override @AfterEach protected void tearDown3() {}",
"",
" @Override @AfterAll void tearDown5() {}",
" @Override @AfterAll public void tearDown6() {}",
" @Override @AfterAll protected void tearDown7() {}",
" @Override @AfterAll void afterAll5() {}",
" @Override @AfterAll public void afterAll6() {}",
" @Override @AfterAll protected void afterAll7() {}",
"",
" @Override @Test void method1() {}",
" @Override @Test void testMethod2() {}",
@@ -163,10 +163,10 @@ public final class JUnitMethodDeclarationCheckTest {
"import org.junit.jupiter.params.ParameterizedTest;",
"",
"class A {",
" @BeforeAll void setUp1() {}",
" @BeforeEach void setUp2() {}",
" @AfterEach void setUp3() {}",
" @AfterAll void setUp4() {}",
" @BeforeAll void beforeAll() {}",
" @BeforeEach void setUp() {}",
" @AfterEach void tearDown() {}",
" @AfterAll void afterAll() {}",
"",
" @Test void foo() {}",
" @ParameterizedTest void bar() {}",
@@ -177,4 +177,36 @@ public final class JUnitMethodDeclarationCheckTest {
"}")
.doTest(TestMode.TEXT_MATCH);
}
@Test
void replaceSetupAndTeardownMethods() {
refactoringTestHelper
.addInputLines(
"in/A.java",
"import org.junit.jupiter.api.AfterAll;",
"import org.junit.jupiter.api.AfterEach;",
"import org.junit.jupiter.api.BeforeAll;",
"import org.junit.jupiter.api.BeforeEach;",
"",
"class A {",
" @BeforeAll public void setUp1() {}",
" @BeforeEach protected void setUp2() {}",
" @AfterEach private void setUp3() {}",
" @AfterAll private void setUp4() {}",
"}")
.addOutputLines(
"out/A.java",
"import org.junit.jupiter.api.AfterAll;",
"import org.junit.jupiter.api.AfterEach;",
"import org.junit.jupiter.api.BeforeAll;",
"import org.junit.jupiter.api.BeforeEach;",
"",
"class A {",
" @BeforeAll void beforeAll() {}",
" @BeforeEach void setUp() {}",
" @AfterEach void tearDown() {}",
" @AfterAll void afterAll() {}",
"}")
.doTest(TestMode.TEXT_MATCH);
}
}