Our current development team is split, some working on windows machines, others on macs, with continuous integration tests running against both windows and linux environments. We’ve had a need to run operating specific JUnit4 tests and I got a little tired putting guard clauses into different @Before, @After and @Test methods to prevent a particular block of code running.
Using the new org.junit.runner.Runner annotation, and SystemUtils from commons-lang, here is the result:
package com.thekua.java.junit4.examples; import org.apache.commons.lang.SystemUtils; import org.junit.internal.runners.InitializationError; import org.junit.internal.runners.JUnit4ClassRunner; import org.junit.runner.notification.RunNotifier; public class RunOnlyOnWindows extends JUnit4ClassRunner { public RunOnlyOnWindows(Class> klass) throws InitializationError { super(klass); } @Override public void run(RunNotifier notifier) { if (SystemUtils.IS_OS_WINDOWS) { super.run(notifier); } } }
Our test classes, then look like this:
... @RunWith(value=RunOnlyOnWindows.class) public class WindowsOnlySpecificFooBarUnitTest { ... }
Of course, you can use any other particular variations like SystemUtils.IS_OS_UNIX, or SystemUtils.IS_OS_MAC but we haven’t needed to yet.
Of course, this is easily turned into some sort of conditional runner abstract class but at least you get the basic idea.
From Junit 4.4 you can do this even simpler, using assumeThat():
@Test
public void windowsOnlyTest () {
assumeThat(SystemUtils.IS_OS_WINDOWS);
// windows specific test goes here
}
@Henk
Should be
assumeTrue(SystemUtils.IS_OS_WINDOWS);
instead ofassumeThat(SystemUtils.IS_OS_WINDOWS);