2.7 KiB
Mock线程池内的调用
TestableMock
采用来自transmittable-thread-local项目的TransmittableThreadLocal
类型存储测试用例运行期的MOCK_CONTEXT
内容和Mock方法调用过程。
当线程池中的执行对象未经过TtlRunnable
或TtlCallable
处理时,TransmittableThreadLocal
将自动降级为与InheritableThreadLocal
等效的类型,即只对父子线程有效,无法在线程池上下文中正常传递存储数据。因而会导致MOCK_CONTEXT
内容丢失和verifyInvoked()
方法校验结果不正确的情况。
为此,可以启用Testable全局配置thread.pool.enhance.enable=true
,来自动在测试启动时自动封装程序中的普通Runnable
和Callable
对象,使TransmittableThreadLocal
恢复跨线程池存储数据的能力。
同时还需要配合修改项目pom.xml
或build.gradle
文件,将transmittable-thread-local
中的类型增加到TestableMock
运行的Classpath里,具体方法如下。
使用Maven构建
首先增加一个属性,以便将来修改该依赖的版本值:
<properties>
<transmittable.thread.local.version>2.12.1</transmittable.thread.local.version>
</properties>
然后,在maven-surefire-plugin
插件的argLine
参数中添加运行参数-Xbootclasspath/a:${settings.localRepository}/com/alibaba/transmittable-thread-local/${transmittable.thread.local.version}/transmittable-thread-local-${transmittable.thread.local.version}.jar
。
添加后的完整maven-surefire-plugin
配置参考:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Xbootclasspath/a:${settings.localRepository}/com/alibaba/transmittable-thread-local/${transmittable.thread.local.version}/transmittable-thread-local-${transmittable.thread.local.version}.jar -javaagent:${settings.localRepository}/com/alibaba/testable/testable-agent/${testable.version}/testable-agent-${testable.version}.jar</argLine>
</configuration>
</plugin>
</plugins>
</build>
使用Gradle构建
在test
区块内添加测试参数jvmArgs "-Xbootclasspath/a:${classpath.find { it.name.contains("transmittable-thread-local") }.absolutePath}"
添加后的完整test
区块配置参考:
test {
jvmArgs "-javaagent:${classpath.find { it.name.contains("testable-agent") }.absolutePath}"
jvmArgs "-Xbootclasspath/a:${classpath.find { it.name.contains("transmittable-thread-local") }.absolutePath}"
... // 其他测试配置
}