有没有办法在JUnit 4测试类中知道,如果Class是由Test-Suite发起的?我想在所有测试之前运行全局事物(关于内存数据库),所以我认为在测试套件中这样做.但是,我仍然希望能够在没有测试套件的情况下一次启动一个测试,所以我需要知道是否需要在测试的@Before部分初始化全局事物...是否有人知道如果它是可能的 ?
有几种方法可以实现这一目标.最简单和最简单的方法是在套件的开头和结尾运行"测试",设置数据库,然后设置全局标志.在@Before和@After测试中,您检查此标志,如有必要,请进行设置/拆卸.
@RunWith(Suite.class)
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class});
Run Code Online (Sandbox Code Playgroud)
这是最简单的解决方案,但它不是很好,所以更简洁的解决方案是使用TestRule.看看扩展ExternalResource.这实现了围绕您的测试方法的逻辑之前和之后.这将允许您分解@Before和@After方法,以便在任何地方重用相同的代码.
然后,对于您的套件,您还需要在逻辑之前/之后实现.遗憾的是,使用@RunWith(Suite.class)注释的类实际上并未实例化,因此您无法使用该类的构造函数,但可以扩展Suite.根据您将如何运行它,您将需要实现一个构造函数,使用@RunWith作为示例:
public class MySuite extends Suite {
/**
* Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code>
*
* @param klass the root class
* @param builder builds runners for classes in the suite
* @throws InitializationError
*/
public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
this(builder, klass, getAnnotatedClasses(klass));
// put your global setup here
// set global variable
}
}
Run Code Online (Sandbox Code Playgroud)
然后运行你的测试套件
@RunWith(MySuite.class)
Run Code Online (Sandbox Code Playgroud)
有几个构造函数在不同的情况下使用,请查看每个构造函数旁边的注释以了解具体细节.您仍然需要使用全局变量,以便规则不会重新执行设置代码.如果您只想执行设置代码,执行拆卸代码更难,但上述操作可以完成.如果您需要,请告诉我:-)
如果您想要更多的灵活性(比如仅针对特定方法执行设置代码),那么请参阅我如何在套件中定义JUnit方法规则的答案?.
归档时间: |
|
查看次数: |
5686 次 |
最近记录: |