<h2>Summary of Changes in version 4.9, final</h2> <p>Release theme: Test-class and suite level Rules.</p> <h3>ClassRule</h3> <p>The <code>ClassRule</code> annotation extends the idea of method-level Rules, adding static fields that can affect the operation of a whole class. Any subclass of <code>ParentRunner</code>, including the standard <code>BlockJUnit4ClassRunner</code> and <code>Suite</code> classes, will support <code>ClassRule</code>s.</p> <p>For example, here is a test suite that connects to a server once before all the test classes run, and disconnects after they are finished:</p> <pre><code>@RunWith(Suite.class) @SuiteClasses({A.class, B.class, C.class}) public class UsesExternalResource { public static Server myServer= new Server(); @ClassRule public static ExternalResource resource= new ExternalResource() { @Override protected void before() throws Throwable { myServer.connect(); }; @Override protected void after() { myServer.disconnect(); }; }; } </code></pre> <h3>TestRule</h3> <p>In JUnit 4.9, fields that can be annotated with either <code>@Rule</code> or <code>@ClassRule</code> should be of type <code>TestRule</code>. The old <code>MethodRule</code> type, which only made sense for method-level rules, will still work, but is deprecated.</p> <p>Most built-in Rules have been moved to the new type already, in a way that should be transparent to most users. <code>TestWatchman</code> has been deprecated, and replaced by <code>TestWatcher</code>, which has the same functionality, but implements the new type.</p> <h3>Maven support</h3> <p>Maven bundles have, in the past, been uploaded by kind volunteers. Starting with this release, the JUnit team is attempting to perform this task ourselves.</p> <h3>LICENSE checked in</h3> <p>The Common Public License that JUnit is released under is now included in the source repository.</p> <h3>Bug fixes</h3> <ul> <li>github#98: assumeTrue() does not work with expected exceptions</li> <li><p>github#74: Categories + Parameterized</p> <p>In JUnit 4.8.2, the Categories runner would fail to run correctly if any contained test class had a custom Runner with a structure significantly different from the built-in Runner. With this fix, such classes can be assigned one or more categories at the class level, and will be run correctly. Trying to assign categories to methods within such a class will flag an error.</p></li> <li><p>github#38: ParentRunner filters more than once</p> <p>Thanks to <code>@reinholdfuereder</code></p></li> <li><p>github#248: protected BlockJUnit4ClassRunner#rules method removed from 4.8.2</p></li> <li>github#187: Accidental dependency on Java 6</li> </ul> <p>Thanks to <code>@kcooney</code> for:</p> <ul> <li>github#163: Bad comparison failure message when using assertEquals(String, String)</li> <li>github#227: ParentRunner now assumes that getChildren() returns a modifiable list</li> </ul> <h3>Minor changes</h3> <ul> <li>Backed out unused folder "experimental-use-of-antunit", replaced by bash-based script at build_tests.sh</li> <li>Various Javadoc fixes</li> </ul> <p>Thanks to <code>@kcooney</code> for:</p> <ul> <li>Made MultipleFailureException public, to assist extension writers.</li> <li>github#240: Add "test" target to build.xml, for faster ant-driven testing.</li> <li>github#247: Give InitializationError a useful message</li> </ul>