Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 如何对所有测试只初始化一次Spring applicationContext_Java_Spring_Junit4_Spring Test - Fatal编程技术网

Java 如何对所有测试只初始化一次Spring applicationContext

Java 如何对所有测试只初始化一次Spring applicationContext,java,spring,junit4,spring-test,Java,Spring,Junit4,Spring Test,我有一组基于spring的测试,需要spring上下文 为了快速执行测试,我想确保Spring上下文只初始化一次,然后所有测试都应该在这个上下文上运行,然后它应该关闭 我已经尝试了以下方法: 使用@RunWith(SpringJUnit4ClassRunner.class)和@ContextConfiguration(MyAnnotatedConfig.class)初始化spring上下文 将@RunWith(SpringJUnit4ClassRunner.class)和@TestExecuti

我有一组基于spring的测试,需要spring上下文

为了快速执行测试,我想确保Spring上下文只初始化一次,然后所有测试都应该在这个上下文上运行,然后它应该关闭

我已经尝试了以下方法:

  • 使用
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(MyAnnotatedConfig.class)
    初始化spring上下文
  • @RunWith(SpringJUnit4ClassRunner.class)
    @TestExecutionListeners({MyTestExecutionListener.class})
    与手写测试执行监听器一起使用,该监听器初始化spring上下文并将其注入到具体的测试类中
  • 在基类和静态字段中使用
    @BeforeClass
    侦听器来存储spring上下文,在关闭时使用
    @AfterClass
    侦听器
  • 在这三种方法中,spring上下文似乎被多次初始化,这需要很多时间。JUnit似乎在运行测试时卸载类,因此静态字段的内容有时会丢失

    有没有办法确保spring上下文只初始化一次

    为了快速执行测试,我想确保Spring上下文是 只初始化一次,那么所有测试都应该针对这个 上下文,那么它应该关闭

    我不想问那些显而易见的问题,但是

    你看过报纸了吗

    具体而言,这些部分解释了发生的情况:

    所以,TestContext框架当然支持在测试套件中跨测试缓存,我应该知道,因为这是我写的

    至于为什么缓存不适合您,我只能假设您已经将构建框架配置为每个测试的fork(或者您正在IDE中单独手动运行测试)。下面是上面最后一个链接的摘录,可能会对您有所帮助:

    测试套件和分叉流程

    SpringTestContext框架将应用程序上下文存储在 静态缓存。这意味着上下文实际上存储在 静态变量。换句话说,如果测试以单独的方式执行 在每次测试之间,静态缓存将被清除 执行,这将有效地禁用缓存机制

    为了从缓存机制中获益,所有测试都必须在 相同的过程或测试套件。这可以通过执行所有 在IDE中作为一个组进行测试。类似地,当使用 构建诸如Ant、Maven或Gradle之类的框架 确保构建框架不会在测试之间分叉。对于 例如,如果Maven Surefire插件的forkMode设置为 无论是always还是pertest,TestContext框架都无法缓存 测试类和构建过程之间的应用程序上下文将 因此,运行速度明显减慢

    如果你在考虑上述问题后仍有经验,请考虑这说明你的问题。

    干杯


    Sam

    使用@BoristeSpider是的,这可能是一个选项,尽管它不是我最喜欢的,因为它需要为我们编写的每个新测试增加额外的配置开销。您可以将
    @RunWith
    @TestExecutionListeners
    @ContextConfiguration注释放在基类上,这只会初始化上下文一次。@Jamey这是我尝试过的,对我不起作用:-(嗯,这对我来说绝对有效。这正是我为我们的测试所做的……我想不出为什么这不起作用。你用什么来运行测试?事实上,Boris很在行。我使用一个套件来运行我们的测试,所以我想这可以按照我的要求管理生命周期。:)谢谢Sam。Sumbitting演示项目当然是个好主意,因为问题似乎难以描述。我希望我能抽出时间来做这件事。