1. 概述

本教程将讨论在JUnit 4中避免运行基类测试的方法。在这个教程中,基类只包含辅助方法,而子类将继承它并运行实际的测试

2. 跳过基类测试

假设我们有一个名为BaseUnitTest的基类,其中包含一些辅助方法:

public class BaseUnitTest {
    public void helperMethod() {
        // ...
    }
}

现在,我们扩展它以包含一个包含测试的类:

public class ExtendedBaseUnitTest extends BaseUnitTest {
    @Test
    public void whenDoTest_thenAssert() {
        // ...        
    }
}

如果我们运行测试,无论是通过IDE还是Maven构建,可能会收到错误消息,告诉我们BaseUnitTest中没有可运行的测试方法。我们不希望在这个类中运行测试,所以我们正在寻找一种避免这种错误的方法

我们将探讨三种不同的可能性。如果使用IDE运行测试,结果可能会根据我们使用的插件和如何配置它来运行JUnit测试而有所不同。

2.1. 重命名类

我们可以将类名更改为构建规范将排除其作为测试运行的名称。例如,如果我们使用Maven,可以查看Maven Surefire插件的默认设置。

我们可以将名称从BaseUnitTest更改为BaseUnitTestHelper或类似名称

public class BaseUnitTestHelper {
    public void helperMethod() {
        // ...
    }
}

2.2. 忽略

另一种选择是使用JUnit的@Ignore注解暂时禁用测试。我们可以在类级别添加它以禁用类中的所有测试:

@Ignore("Class not ready for tests")
public class IgnoreClassUnitTest {
    @Test
    public void whenDoTest_thenAssert() {
        // ...
    }
}

同样,我们也可以在方法级别添加它,以防我们仍然需要在类内运行其他测试,但只想排除一两个

public class IgnoreMethodTest {
    @Ignore("This method not ready yet")
    @Test
    public void whenMethodIsIgnored_thenTestsDoNotRun() {
        // ...
    }
}

如果使用Maven运行,我们将看到如下输出:

Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0.041 s - in com.baeldung.IgnoreMethodTest

**自JUnit 5以来,@Disabled注解取代了@Ignore**。

2.3. 将基类设为抽象

可能最好的方法是使基测试类成为抽象的。抽象化需要一个具体的类来扩展它。因此,无论如何,JUnit都不会考虑它是一个测试实例。

让我们让BaseUnitTest类成为抽象的:

public abstract class BaseUnitTest {
    public void helperMethod() {
        // ...
    }
}

3. 总结

在这篇文章中,我们看到了在JUnit 4中排除基类测试的一些示例。最好的方法是创建抽象类。

JUnit的@Ignore注解也很常用,但被认为是一种坏实践。通过忽略测试,我们可能会忘记它们及其被忽略的原因

如往常一样,本文中展示的代码可在GitHub上找到