Test class inherits from JUnit 3's TestCase but has JUnit 4 @Test or @RunWith annotations.


The problem

For JUnit3-style tests, behavior is defined in junit.framework.TestCase and tests add behavior by overriding methods. For JUnit4-style tests, special behavior happens with fields and methods annotated with JUnit 4 annotations. Having JUnit4-style tests extend from junit.framework.TestCase (directly or indirectly) historically has been a source of test bugs and unexpected behavior (e.g.: teardown logic and/or verification does not run because JUnit doesn’t call the inherited code).

Error Prone also cannot infer whether the test class runs with JUnit 3 or JUnit 4.

Thus, even if the test class runs with JUnit 4, Error Prone will not run additional checks which can catch common errors with JUnit 4 test classes. Either use only JUnit4 classes and annotations and remove the inheritance from TestCase, or use only JUnit 3 and remove the @Test annotations. When looking for replacements for base test classes, consider using Rules (see the @Rule annotation and implementations of TestRule and MethodRule).


Suppress false positives by adding the suppression annotation @SuppressWarnings("JUnitAmbiguousTestClass") to the enclosing element.