我正在使用intellij、maven 3和flink 1.15.1编写一个有状态流作业。我正在尝试为我的自定义KeyedProcessFunction编写单元测试,并尝试遵循这里的文档,同时添加这里提到的依赖项。我对使用KeyedOneInputStreamOperatorTestHarness类很感兴趣,但在我的任何依赖项中都找不到该类(下面发布了经过编辑的pom(。我唯一能找到这门课的时间是通过包括
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.14.5</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>
它来自以前的版本。闪烁>=1.15.0现在不需要依赖scala的库,所以1.15.1没有flink-streaming-java_2.12。
我想使用的课程是被转移到其他地方还是被故意排除在外?我已经尝试了我所知道的所有谷歌foo,我可以在flink repo中找到该类,但在我迄今为止尝试过的任何flink依赖项中都找不到,除此之外<1.14.5一个。我是做错了什么还是遗漏了一些文档?使用1.14.5库是我唯一的选择吗?还是有一些我不知道的新型测试实用程序?
没有类的Pom依赖项:
...
<flink.version>1.15.1</flink.version>
...
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka</artifactId>
<version>${flink.version}</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-test-utils</artifactId>
<version>${flink.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-test-utils-junit</artifactId>
<version>${flink.version}</version>
<scope>test</scope>
</dependency>
...
我似乎已经想通了,但我的专业知识有限,所以我不确定利弊。我还想未来版本的flink会改变这一点。额外的好处是,我可以使用最新的flink版本,而不包括在旧代码中。
我添加了这些依赖项进行测试(至少1.15.1(:
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-test-utils</artifactId>
<version>${flink.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java</artifactId>
<version>${flink.version}</version>
<scope>test</scope>
<classifier>tests</classifier>
<type>test-jar</type>
</dependency>
我看到了关于工件和分类器标记的flink自述,我知道我需要的类在flink流式java包中,特别是在它的测试部分。因此,在<classifier>tests</classifier>
标记中包含对flink流式java的依赖使得测试类可用。
值得一提的是,文档中有一个神秘的警告:
当用户应该引入Flink测试依赖项时很有用。这主要是为了测试线束,可能不是您想要的。
我仍然需要它提供的mock runner的flink测试实用程序。
在上面提到的链接中,
https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/dev/datastream/testing/
上面写着,
"请注意,AbstractStreamOperatorTestHarness及其派生类目前不是公共API的一部分,可能会发生更改">
我以前遇到过这个问题,没有遇到任何实际包含这些类的工件。
更新:
TL;DR从源代码构建并直接包含jar。
解决方案:从github页面找到flink源代码以获得正确的版本:https://github.com/apache/flink/releases/tag/release-x.xx
cd /path/to/flink-release-x.xx
unzip flink-release-x.xx.zip
解压缩文件,然后按照说明构建项目。这通常意味着运行
mvn clean package -DskipTests
确保您使用的是maven和java的正确版本。maven版本通常可以通过在pom.xml文件中查找以下两个属性之一来查看:maven.comfiler.source或maven.comiler.target
如果您使用的是最新版本,您可以简单地克隆整个项目并使用maven构建脚本。然而,这对我的案例不起作用,因为我需要一个早期版本。
一旦建成,测试线束就位于这个罐子里:flink-release-x.xx/flink-streaming-java/target/flink-sttreaming-java-x.xx-tests.jar
您可以使用IDE、gradle、maven等将这个jar添加到类路径中,从而直接包含它。在我的案例中,我将jar直接复制到了这个文件夹中:/libs/并通过在我的build.gradle文件中添加以下内容来包含它:
compile fileTree(dir: 'libs', include: ['*.jar'])
您可能还需要添加以下运行时jar:flink-release-x.xx/flink-runtime/target/flink-runtime-x.xx.jar
对于Intellij,您可以直接添加jar,方法是转到,文件->项目结构->模块->依赖项->quot+"->;JAR或目录
希望这能有所帮助!