19

我有一个通过 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

有人有替代建议吗?

4

5 回答 5

26

在 Junit5 中,有针对特定操作系统配置或运行测试的选项。

@EnabledOnOs({ LINUX, MAC })
void onLinuxOrMac() {

}

@DisabledOnOs(WINDOWS)
void notOnWindows() {
    // ...
}
于 2018-03-28T05:28:21.570 回答
23

你研究过假设吗?在之前的方法中,您可以这样做:

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

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

于 2014-05-01T15:27:23.150 回答
4

你看过 JUnit 的假设吗?

用于陈述关于测试有意义的条件的假设。失败的假设并不意味着代码被破坏,而是测试没有提供有用的信息。默认的 JUnit 运行器将假设失败的测试视为已忽略

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

于 2014-05-01T15:25:44.117 回答
2

If you use Apache Commons Lang's SystemUtils, in your @Before method you can add:

Assume.assumeTrue(SystemUtils.IS_OS_WINDOWS);
于 2020-02-05T16:53:53.423 回答
0

大概您不需要在 junit 测试中实际调用 Windows API;您只关心作为单元测试目标的类调用它认为是 Windows API 的内容。

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

于 2014-05-01T15:42:40.337 回答