第一个问题是 Test3 使用@RunWith(Suite.class)
,但不包含@Suite.SuiteClasses({Test3.class, .....})
. 这会产生一个IntializationError: class 'Test3' must have a SuiteClasses annotation
. 由于您不打算在 Test3 下有任何类,因此应删除此注释。
第二个问题Exception: No runnable methods
几乎总是由于忘记添加@Test
到测试中。你没有在你的样本中进行测试,所以我不知道是否真的如此,但这是最可能的原因。
以下是您的代码的工作版本,它允许从任何类运行测试:
测试1.java
import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({Test2.class})
public class Test1 {
}
Test2.java
import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({Test3.class})
public class Test2 {
}
Test3.java
import static org.junit.Assert.*;
import org.junit.*;
public class Test3 {
@Test
public void testTrue(){
assertTrue(true);
}
}
至于是否有比组织事物更好的方法,我想这取决于您决定如何创建类。由于您可以将套件添加到套件中,因此可以创建较小的套件块,这些套件依赖于所有内容,例如树。例如,我通常做的是:
AllTestSuite
TextParsingSuite
GuiSuite
SwingSuite
JavaFXSuite
FileIOSuite
一个测试被添加到最相关的套件中。最后,我认为我没有任何包含超过 10 个测试类/套件左右的套件。如果我这样做了,是时候制作一个新的子套件了。换句话说,没有“某处的巨大列表”,只是将许多较小的列表组合成另一个列表,以便有效地制作一个大列表。
我想您可以使用一些工具来动态查找所有包含测试的 Java 类,但是 JUnit 本身不支持这种行为(它只运行您告诉它的测试,我个人认为这是一件好事)。