## 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.
