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.