是否可以缓存Spring';类之间的应用程序上下文?

是否可以缓存Spring';类之间的应用程序上下文?,spring,gradle,junit,spring-test,applicationcontext,Spring,Gradle,Junit,Spring Test,Applicationcontext,我正在努力提高我正在从事的一个项目的Spring集成测试的性能。我们正在使用Spring+Gradle+JUnit 使用build.gradle文件中的此配置: test { useJUnit() setForkEvery(0) setMaxParallelForks(1) } 我们能够在单个JVM中运行所有测试。虽然我认为这是默认行为 但我在application-test.yml中读到了关于和关于此属性的内容: logging: level: org:

我正在努力提高我正在从事的一个项目的Spring集成测试的性能。我们正在使用Spring+Gradle+JUnit

使用
build.gradle
文件中的此配置:

test {
    useJUnit()
    setForkEvery(0)
    setMaxParallelForks(1)
}
我们能够在单个JVM中运行所有测试。虽然我认为这是默认行为

但我在application-test.yml中读到了关于和关于此属性的内容:

logging:
  level:
    org:
      springframework:
        test:
          context:
            cache: DEBUG
我注意到在同一类中运行的测试方法的以下日志

2017-09-05 08:33:11.829 DEBUG 5764 --- [    Test worker] c.DefaultCacheAwareContextLoaderDelegate : Storing ApplicationContext in cache under key [THIS HAD SENSITIVE DATA]
2017-09-05 08:33:11.830 DEBUG 5764 --- [    Test worker] org.springframework.test.context.cache   : Spring test ApplicationContext cache statistics: [DefaultContextCache@572e81e7 size = 1, maxSize = 32, parentContextCount = 0, hitCount = 0, missCount = 1]
2017-09-05 08:33:11.849 DEBUG 5764 --- [    Test worker] c.DefaultCacheAwareContextLoaderDelegate : Retrieved ApplicationContext from cache with key [THIS HAD SENSITIVE DATA]
2017-09-05 08:33:11.850 DEBUG 5764 --- [    Test worker] org.springframework.test.context.cache   : Spring test ApplicationContext cache statistics: [DefaultContextCache@572e81e7 size = 1, maxSize = 32, parentContextCount = 0, hitCount = 1, missCount = 1]
还有更多的行显示,
从缓存中用键检索到ApplicationContext…

对于在其他类中运行的测试方法,我注意到类似的日志,例如:

2017-09-05 08:33:12.971 DEBUG 10288 --- [    Test worker] c.DefaultCacheAwareContextLoaderDelegate : Storing ApplicationContext in cache under key [THIS HAD SENSITIVE DATA]
2017-09-05 08:33:12.971 DEBUG 10288 --- [    Test worker] org.springframework.test.context.cache   : Spring test ApplicationContext cache statistics: [DefaultContextCache@2dad6721 size = 1, maxSize = 32, parentContextCount = 0, hitCount = 0, missCount = 1]
2017-09-05 08:33:13.194 DEBUG 10288 --- [    Test worker] c.DefaultCacheAwareContextLoaderDelegate : Retrieved ApplicationContext from cache with key [THIS HAD SENSITIVE DATA]
2017-09-05 08:33:13.194 DEBUG 10288 --- [    Test worker] org.springframework.test.context.cache   : Spring test ApplicationContext cache statistics: [DefaultContextCache@2dad6721 size = 1, maxSize = 32, parentContextCount = 0, hitCount = 1, missCount = 1]
两个类的注释相同:

@RunWith(SpringRunner.class)
@春靴测试
@AutoConfigureMockMvc
@ActiveProfiles({“默认”、“配置文件-1”、“配置文件-2”})
公共类SomeControllerTest{
//测试方法。。。
}
我认为这两个类中的测试方法应该可以共享相同的
ApplicationContext
,从而减少测试持续的时间。但是,有可能做到这一点吗?如果是,怎么做


我注意到两个
ApplicationContext
对象几乎同时存储在缓存中
08:33:11.829
08:33:12.971
。测试运行程序是否在不同的线程或其他地方执行测试?

您的上下文实际上是缓存的,但实际上您有两个不同的上下文,因为您使用了Spring Boot的
@MockBean
功能

使用
@MockBean
会导致每个
ApplicationContext
都有一个不同的唯一键,在该键下它存储在上下文缓存中

尽管这可能不会在任何地方公开记录,但实际上,
org.springframework.boot.test.mock.mockito.MockitoContextCustomizerFactory的实现中有在线文档

我们在这里收集显式模拟定义,因为它们构成MergedContextConfiguration键的一部分。不同的模拟需要有不同的键


我已经针对Spring Boot发布了一个问题来记录这种行为:

您是否碰巧使用了
@MockBean
@SpyBean
?我们没有使用
@SpyBean
,但我们使用了一些
@MockBean
注释,这些注释在不同的控制器测试类之间是不同的。。。你认为这就是原因吗?我认为
@MockBean
将创建单独的上下文,但是如果我使用
@SpyBean
???那么它会起作用吗?在我的例子中,使用
@MockBean
@SpyBean
的类会导致上下文根本不被共享!