Search code examples
javajunitjunit-rule

Run unit tests only on Windows


I have a class that makes native Windows API calls through JNA. How can I write JUnit tests that will execute on a Windows development machine but will be ignored on a Unix build server?

I can easily get the host OS using System.getProperty("os.name")

I can write guard blocks in my tests:

@Test public void testSomeWindowsAPICall() throws Exception {
  if (isWindows()) {
    // do tests...
  }
}

This extra boiler plate code is not ideal.

Alternatively I have created a JUnit rule that only runs the test method on Windows:

  public class WindowsOnlyRule implements TestRule {
    @Override
    public Statement apply(final Statement base, final Description description) {
      return new Statement() {
        @Override
        public void evaluate() throws Throwable {
          if (isWindows()) {
            base.evaluate();
          }
        }
      };
    }

    private boolean isWindows() {
      return System.getProperty("os.name").startsWith("Windows");
    }
  }

And this can be enforced by adding this annotated field to my test class:

@Rule public WindowsOnlyRule runTestOnlyOnWindows = new WindowsOnlyRule();

Both these mechanisms are deficient in my opinion in that on a Unix machine they will silently pass. It would be nicer if they could be marked somehow at execution time with something similar to @Ignore

Does anybody have an alternative suggestion?


Solution

  • Have you looked into assumptions? In the before method you can do this:

    @Before
    public void windowsOnly() {
        org.junit.Assume.assumeTrue(isWindows());
    }
    

    Documentation: http://junit.sourceforge.net/javadoc/org/junit/Assume.html