是否可以缓存Spring';类之间的应用程序上下文?
我正在努力提高我正在从事的一个项目的Spring集成测试的性能。我们正在使用Spring+Gradle+JUnit 使用是否可以缓存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:
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
的类会导致上下文根本不被共享!