我意识到这在 5 年前就已经被问过了,但是由于很多人对这个问题投了赞成票,我认为我仍然会提出解决方案。如果您只想要解决方案,请直接跳到最后;如果您也想理解它,请阅读全文;-)
首先,确实可以确保特定的 JUnit 测试类只在测试套件内运行。此外,您是否想在 Eclipse(如此处所问)或任何其他工具或环境中运行该测试套件也无关紧要;这在很大程度上是一个纯粹的 JUnit 问题。
在我勾勒出解决方案之前,重新审视一下这里的确切问题可能是个好主意。所有 JUnit 测试都需要是可见的和可实例化的,以便 JUnit 框架及其各种运行程序能够获取。这也适用于测试套件和作为测试套件一部分的各个测试。因此,如果 JUnit 选择了测试套件,它也会选择单独的测试,并且套件中的所有测试都将执行两次,一次单独执行,一次作为套件的一部分执行。
所以,如果你愿意的话,诀窍是防止 JUnit 拾取单个测试,同时仍然能够将它们作为套件的一部分进行实例化和执行。
想到的一件事是使测试类成为嵌套在测试套件中的静态内部类。但是,嵌套类仍然需要是公共的(否则它们也不能在套件中运行),如果它们是公共类,它们也会被单独拾取,尽管它们嵌套在套件的公共类中。不过,JUnit 不会尝试运行不可见的测试类。因此,将测试类嵌套在非公共类中可能足以隐藏它们,但我们不能将套件类设为非公共类,因为 JUnit 不会执行它。然而,我们可以做的是将各个测试嵌套在另一个嵌套在测试套件中的非公共类中,这导致我们解决了这个难题:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({AllTests.InSuiteOnly.Test1.class, AllTests.InSuiteOnly.Test2.class})
public class AllTests
{
static class InSuiteOnly
{
public static class Test1
{
@Test
public void test1()
{
//...
}
}
public static class Test2
{
@Test
public void test2()
{
//...
}
}
}
}
很多人可能会反对现在需要在单个源文件中进行的所有测试。如果我想维护单独的 JUnit 测试类,这些测试类不会自行执行但仍会在测试套件中执行,该怎么办?一个简单的解决方案是使各个测试类抽象(公共/非公共无关紧要),以便 JUnit 不会执行它们,并且在测试套件中,我们只需使用原始抽象测试类的具体子类:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({AllTests.InSuiteOnly.SuiteTest1.class, AllTests.InSuiteOnly.SuiteTest2.class})
public class AllTests
{
static class InSuiteOnly
{
public static class SuiteTest1 extends Test1 {}
public static class SuiteTest2 extends Test2 {}
}
}
abstract class Test1
{
@Test
public void test1()
{
//...
}
}
abstract class Test2
{
@Test
public void test2()
{
//...
}
}
此方案适用于 Maven、Eclipse 和所有其他直接利用 JUnit 运行器或实现自己的运行器的环境,这些运行器密切遵循 JUnit 的原始行为和语义。