使用PAssert测试管道比较对象containsInAnyOrder()

时间:2018-05-18 07:21:25

标签: java apache beam

我正在为Apache Beam管道编写JUnit测试。我开始使用DoFnTester,虽然Apache Beam"测试你的管道"中的例子已经被弃用了。文档是指已被弃用的方法。

我现在正在使用推荐的TestPipeline和PAssert,但我对PAssert有困难,因为我见过的所有示例都使用了字符串。

管道输出对象,因此测试失败作为其比较对象。我的第一直觉是创建派生对象并覆盖equals()。我无法让它工作(我只使用Java几周,所以也许没有帮助)并且测试仍在调用原始的equals()方法。

然后我想到迭代输出PCollection,因为我正在使用测试管道,管道中最多只有一个或两个元素,但我找不到任何如何做到这一点的例子。不确定这是否是正确的测试方式。

我已经阅读了Apache文档,并发现此评论" PAssert对象不支持Object.equals(Object)。如果您打算测试对象相等性,请改用containsInAnyOrder(T ...)的变体。"。这听起来正是我需要的,但问题是我不知道如何创建containsInAnyOrder()的变体来做到这一点,我找不到任何例子。

我已经用尽了google的东西!许多示例已过时(包括Apaches自己的文档)引用已弃用的方法。我在PAssert中找到的所有例子都假设输出元素是字符串。

我需要做的就是覆盖containsInAnyOrder,这样我就可以进行自己的对象比较了。有人可以帮忙吗?

PAssert.that(output).containsInAnyOrder(expected);

如果有人能指出我会非常感激的一些例子。

1 个答案:

答案 0 :(得分:0)

重写对象类中的pd.PeriodIndex(df['dates'], freq = 'Q-MAR').strftime('%F') 方法以适当地比较两个对象。 equals只是使用Assert方法来比较对象。有关如何覆盖equals的信息,请参见this page