testable-mock/docs/zh-cn/doc/with-thread-pool.md

2.7 KiB
Raw Blame History

Mock线程池内的调用

TestableMock采用来自transmittable-thread-local项目的TransmittableThreadLocal类型存储测试用例运行期的MOCK_CONTEXT内容和Mock方法调用过程。

当线程池中的执行对象未经过TtlRunnableTtlCallable处理时,TransmittableThreadLocal将自动降级为与InheritableThreadLocal等效的类型,即只对父子线程有效,无法在线程池上下文中正常传递存储数据。因而会导致MOCK_CONTEXT内容丢失和verifyInvoked()方法校验结果不正确的情况。

为此,可以启用Testable全局配置thread.pool.enhance.enable=true,来自动在测试启动时自动封装程序中的普通RunnableCallable对象,使TransmittableThreadLocal恢复跨线程池存储数据的能力。

同时还需要配合修改项目pom.xmlbuild.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}"
  ... // 其他测试配置
}