Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试调用:如何设置所有测试套件的通用性_Java_Junit4 - Fatal编程技术网

Java 测试调用:如何设置所有测试套件的通用性

Java 测试调用:如何设置所有测试套件的通用性,java,junit4,Java,Junit4,在JUnit4测试类中,是否有方法知道该类是否由测试套件启动? 在所有测试之前(关于内存中的DB),我有一些全局的东西要运行,所以我想在测试套装中运行它。但是,我仍然希望能够在没有测试服的情况下一次启动一个测试,因此我需要知道是否需要在测试的@Before部分初始化全局内容。。。有人知道这是否可能吗 我将使用JUnit和注释来指示执行此类工作的方法 从@BeforeClass Javadoc: 有时,一些测试需要共享计算上昂贵的设置 (就像登录数据库一样)。而这可能会损害 测试的独立性,有时是必

在JUnit4测试类中,是否有方法知道该类是否由测试套件启动? 在所有测试之前(关于内存中的DB),我有一些全局的东西要运行,所以我想在测试套装中运行它。但是,我仍然希望能够在没有测试服的情况下一次启动一个测试,因此我需要知道是否需要在测试的@Before部分初始化全局内容。。。有人知道这是否可能吗

我将使用JUnit和注释来指示执行此类工作的方法

从@BeforeClass Javadoc:

有时,一些测试需要共享计算上昂贵的设置 (就像登录数据库一样)。而这可能会损害 测试的独立性,有时是必要的优化。 用@BeforeClass注释公共静态void no arg方法 它必须在类中的任何测试方法之前运行一次。这个 @超类的BeforeClass方法将在这些方法之前运行 现在的班级


有几种方法可以实现这一点。最简单和最简单的方法是在套件的开头和结尾运行一个“测试”,设置数据库,然后设置一个全局标志。在@Before和@After测试中,检查此标志,如有必要,进行设置/拆卸

@RunWith(Suite.class)
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class});
这是最简单的解决方案,但不是很好,所以更简洁的解决方案是使用一个。看看扩展。这实现了围绕测试方法的前后逻辑。这将允许您考虑@Before和@After方法,以便在任何地方重用相同的代码

然后,对于您的套件,您还需要实现before/after逻辑。不幸的是,用@RunWith(Suite.class)注释的类实际上没有实例化,因此您不能使用该类的构造函数,但可以扩展。根据运行方式的不同,您将需要实现一个构造函数,以@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
    }
}
然后使用

@RunWith(MySuite.class)
有几个构造函数在不同的情况下使用,请查看每个构造函数旁边的注释以了解详细信息。您仍然需要使用全局变量,以便您的规则不会重新执行设置代码。如果您只想执行安装代码,那么上面的方法就行了,执行拆卸代码比较困难,但是可以完成。如果您需要,请告诉我:-)


如果您想要更大的灵活性(比如只针对特定方法执行设置代码),请参阅我的答案。

您可以在每个测试套件中放置一些
@BeforeClass
代码,这些代码将委托给执行公共设置的辅助类。辅助类可以有一个
静态布尔值
,记录设置是否已经完成。如果已经完成了,辅助类将什么也不做。

这与一个测试类文件中的几个带注释的@Test方法有关,这不是我要处理的场景,我需要它来处理几个测试类。大多数链接都是死的。