仅在Windows上运行单元测试

时间:2014-05-01 15:21:13

标签: java junit junit-rule

我有一个通过JNA进行本机Windows API调用的类。如何编写将在Windows开发机器上执行但在Unix构建服务器上将被忽略的JUnit测试?

我可以使用System.getProperty("os.name")

轻松获取主机操作系统

我可以在测试中编写保护块:

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

这个额外的锅炉板代码并不理想。

或者我创建了一个仅在Windows上运行测试方法的JUnit规则:

  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");
    }
  }

这可以通过将这个带注释的字段添加到我的测试类来强制执行:

@Rule public WindowsOnlyRule runTestOnlyOnWindows = new WindowsOnlyRule();

我认为这两种机制都存在缺陷,因为在Unix机器上它们会默默地传递。如果可以在执行时以某种方式标记@Ignore

,那就更好了

有人有其他建议吗?

5 个答案:

答案 0 :(得分:18)

您是否考虑过假设?在before方法中,您可以这样做:

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

文档:http://junit.sourceforge.net/javadoc/org/junit/Assume.html

答案 1 :(得分:8)

在Junit5中,可以选择为特定操作系统配置或运行测试。

asm

答案 2 :(得分:3)

你看过JUnit assumptions吗?

  

用于说明关于测试条件的假设   很有意义。失败的假设并不意味着代码被破坏,   但是测试没有提供有用的信息。默认的JUnit   转轮将缺失假设的测试视为忽略

(这似乎符合忽略这些测试的标准)。

答案 3 :(得分:1)

如果使用Apache Commons Lang的SystemUtils,则可以在@Before方法中添加:

Assume.assumeTrue(SystemUtils.IS_OS_WINDOWS);

答案 4 :(得分:0)

据推测,您不需要实际调用Windows API作为junit测试的一部分;你只关心作为单元测试目标的类调用它认为是windows API的那个。

考虑将windows api调用模拟为单元测试的一部分。