Summary of Changes in version 4.5

Installation

  • We are releasing junit-4.5.jar, which contains all the classes necessary to run JUnit, and junit-dep-4.5.jar, which leaves out hamcrest classes, for developers who already use hamcrest outside of JUnit.

Basic JUnit operation

  • JUnitCore now more often exits with the correct exit code (0 for success, 1 for failure)

  • Badly formed test classes (exceptions in constructors, classes without tests, multiple constructors, Suite without @SuiteClasses) produce more helpful error messages

  • Test classes whose only test methods are inherited from superclasses now run.

  • Optimization to annotation processing can cut JUnit overhead by more than half on large test classes, especially when using Theories. [Bug 1796847]

  • A failing assumption in a constructor ignores the class

  • Correct results when comparing the string “null” with potentially null values. [Bug 1857283]

  • Annotating a class with @RunWith(JUnit4.class) will always invoke the default JUnit 4 runner in the current version of JUnit. This default changed from JUnit4ClassRunner in 4.4 to BlockJUnit4ClassRunner in 4.5 (see below), and may change again.

Extension

  • BlockJUnit4Runner is a new implementation of the standard JUnit 4 test class functionality. In contrast to JUnit4ClassRunner (the old implementation):

    • BlockJUnit4Runner has a much simpler implementation based on Statements, allowing new operations to be inserted into the appropriate point in the execution flow.

    • BlockJUnit4Runner is published, and extension and reuse are encouraged, whereas JUnit4ClassRunner was in an internal package, and is now deprecated.

  • ParentRunner is a base class for runners that iterate over a list of “children”, each an object representing a test or suite to run. ParentRunner provides filtering, sorting, @BeforeClass, @AfterClass, and method validation to subclasses.

  • TestClass wraps a class to be run, providing efficient, repeated access to all methods with a given annotation.

  • The new RunnerBuilder API allows extending the behavior of Suite-like custom runners.

  • AssumptionViolatedException.toString() is more informative

Extra Runners

  • Parameterized.eachOne() has been removed

  • New runner Enclosed runs all static inner classes of an outer class.

Theories

  • @Before and @After methods are run before and after each set of attempted parameters on a Theory, and each set of parameters is run on a new instance of the test class.

  • Exposed API's ParameterSignature.getType() and ParameterSignature.getAnnotations()

  • An array of data points can be introduced by a field or method marked with the new annotation @DataPoints

  • The Theories custom runner has been refactored to make it faster and easier to extend

Development

  • Source has been split into directories src/main/java and src/test/java, making it easier to exclude tests from builds, and making JUnit more maven-friendly

  • Test classes in org.junit.tests have been organized into subpackages, hopefully making finding tests easier.

  • ResultMatchers has more informative descriptions.

  • TestSystem allows testing return codes and other system-level interactions.

Incompatible changes

  • Removed Request.classes(String, Class<?>...) factory method