如何借助Bazel引入Flink的TestHarness类测试自定义算子
我之前在Bazel环境下测试Flink异步算子时,也碰到过一模一样的问题——找不到OneInputStreamOperatorTestHarness这类测试类,还踩过目标不存在的坑。其实完全可以搞定,核心是要搞清楚Bazel对Maven测试依赖的处理逻辑,咱们一步步来解决:
1. 先把WORKSPACE里的Flink依赖配置补全
首先要明确:OneInputStreamOperatorTestHarness不在Flink的主jar包里,而是在测试专用的artifact里,所以你得在WORKSPACE里明确引入带test classifier的依赖,之前的错误大概率是只加了主依赖,漏了测试依赖。
用maven_install的话,WORKSPACE配置应该是这样的(注意替换成你实际用的Flink版本和Scala版本,比如如果用Scala 2.11,选1.14.x及以下的Flink版本,高版本已经不再支持2.11了):
load("@bazel_tools//tools/build_defs/repo:maven.bzl", "maven_install") maven_install( artifacts = [ # 项目主依赖 "org.apache.flink:flink-streaming-java:1.17.1", "org.apache.flink:flink-java:1.17.1", # 关键:测试类所在的依赖,必须带test classifier "org.apache.flink:flink-streaming-java:1.17.1:test", "org.apache.flink:flink-test-utils:1.17.1", "org.apache.flink:flink-runtime:1.17.1:test", # 可选:如果用到Mockito、JUnit等测试框架,也加上 "junit:junit:4.13.2", "org.mockito:mockito-core:4.8.1", ], repositories = [ "https://repo1.maven.org/maven2/", ], )
2. 修正BUILD文件的依赖目标
你之前碰到的@testing//:org_apache_flink_flink_streaming_java_2_11不存在的错误,是因为Bazel通过maven_install生成的目标名称规则和你想的不一样。正确的测试依赖目标名称会在末尾加上_test,比如:
- 主依赖
flink-streaming-java对应的目标是@maven//:org_apache_flink_flink_streaming_java - 测试依赖
flink-streaming-java:test对应的目标是@maven//:org_apache_flink_flink_streaming_java_test(如果带Scala版本后缀,就是@maven//:org_apache_flink_flink_streaming_java_2_11_test)
如果不确定目标名,可以用这个命令在终端查找:
bazel query @maven//:*flink_streaming*test
然后你的BUILD文件里的测试目标配置应该是这样的:
java_test( name = "AsyncFunctionTest", srcs = ["AsyncFunctionTest.java"], deps = [ # 项目主依赖 "@maven//:org_apache_flink_flink_streaming_java", "@maven//:org_apache_flink_flink_java", # 测试核心依赖 "@maven//:org_apache_flink_flink_streaming_java_test", "@maven//:org_apache_flink_flink_test_utils", "@maven//:org_apache_flink_flink_runtime_test", # 测试框架依赖 "@maven//:junit_junit", "@maven//:org_mockito_mockito_core", ], )
3. 适配IntelliJ Bazel插件的小技巧
因为你用的是IntelliJ 2019.3.4,这个版本的Bazel插件对maven_install的依赖识别有时候会慢半拍,可以试试这几个操作:
- 点击Bazel插件工具栏的「Sync Project with Bazel」按钮,强制刷新依赖
- 如果还是红标找不到类,直接清掉IntelliJ缓存:
File -> Invalidate Caches... -> Invalidate and Restart - 确认你的Bazel插件版本是适配2019.3的,旧版本插件可能对Maven依赖的解析有问题
4. 最后验证一下
在你的测试类里正常导入:
import org.apache.flink.streaming.util.OneInputStreamOperatorTestHarness;
然后跑一下Bazel测试命令:
bazel test //your/package/path:AsyncFunctionTest
这时候应该就能正常找到类,运行测试了。
总的来说,之前的问题就是没引入测试专用的artifact,以及写错了依赖目标名称,按上面的步骤调整后就能解决。
内容的提问来源于stack exchange,提问作者skydivin4ng3l

