首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多个Gradle项目中重用spring测试上下文

在多个Gradle项目中重用spring测试上下文
EN

Stack Overflow用户
提问于 2016-08-01 21:58:59
回答 1查看 1.9K关注 0票数 3

我有一个典型的分级多项目构建:

代码语言:javascript
复制
project(':common') {
}

project(':project-a') {
    dependencies {
        compile project(':common')
        ..
    }
}

...

project(':project-n') {
    dependencies {
        compile project(':common')
        ..
    }
}

project(':app') {
    dependencies {
        compile project(':project-a')
        ..
        compile project(':project-n')

        ..
    }
}

所有子项目都有一个名为integrataionTest的通用任务,它运行所有集成测试套件(类)。这些类继承了一个带有典型spring测试内容注释的公共父类:

代码语言:javascript
复制
@ContextConfiguration // needed until Spock supports @SpringBootTest
@SpringBootTest(classes = IntegrationTestConfiguration)
@ActiveProfiles("test")
class BaseTest extends Specification {

IntegrationTestConfiguration是用@EnableAutoConfiguration注释的@Configuration类,它只预定义了一些bean,另一些则是实际成熟的@SpringBootApplication类。

问题是,调用gradle integrationTest似乎启动了组件扫描,设置了Spring,在每个子项目中运行测试,然后丢弃上下文,当上下文在所有子项目中基本相同时。

代码语言:javascript
复制
:app:integrationTest
[..]  INFO 38320 --- [       Thread-5] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@206e239d: startup date [..]; root of context hierarchy


:common:integrationTest
[..]  INFO 38361 --- [       Thread-5] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@a6d8c9f: startup date [..]; root of context hierarchy

:project-a:integrationTest
[..]  INFO 38362 --- [       Thread-5] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@181313ca: startup date [..]; root of context hierarchy

..

:project-n:integrationTest
[..]  INFO 38363 --- [       Thread-5] o.s.w.c.s.GenericWebApplicationContext   : Closing org.springframework.web.context.support.GenericWebApplicationContext@68ab1a32: startup date [..]; root of context hierarchy

我想知道是否有一种方法可以让整个设置只运行一次,然后在所有不同的子项目中重用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-03 09:38:13

我认为它不应该像你想要的那样工作--每个子项目都有自己的测试任务,它的测试需要独立于其他项目来执行。

另外,引用格拉德尔的官方文件的话

测试总是在(一个或多个)单独的JVM中运行。下面的示例显示了各种配置选项。

这意味着,由于您的测试任务将不共享JVM,因此它们在物理上不能共享Spring上下文实例。其原因是Spring缓存测试上下文的方式。以下是正式文件的引文

Spring TestContext框架将应用程序上下文存储在静态缓存中。这意味着上下文实际上存储在静态变量中。换句话说,如果测试在单独的进程中执行,静态缓存将在每次测试执行之间被清除,这将有效地禁用缓存机制。 为了从缓存机制中获益,所有测试必须在同一个进程或测试套件中运行。可以通过在IDE中作为一个组执行所有测试来实现。类似地,当使用构建框架(如Ant、Maven或Gradle )执行测试时,必须确保构建框架不会在测试之间分叉。例如,如果Maven Surefire插件的forkMode设置为able或pertest,则TestContext框架将无法在测试类之间缓存应用程序上下文,因此构建过程将运行得慢得多。

尽管如此,如果您的子项目的Spring配置真的没有什么不同,那么您可以只为集成测试目的创建一个新的子项目,然后在那里执行所有的集成测试,尽管如果您的子项目在Spring配置上没有差异,也许可以合并它们,或者至少以不同的方式组织它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38708793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档