如何在PCollection的PAssert中使用自定义比较器/差异

时间:2018-07-29 14:10:39

标签: testing apache-beam google-truth

我有一个类似于以下代码的代码,用于转换协议缓冲区消息的PCollections。因为其中一些很大 我不仅要测试是否相等,还要打印出区别。

我想使用https://google.github.io/truth/fuzzy测试来显示差异。

PCollection<PbMsg1> p1 = ...;
List<PbMsg1> p2 = loadFixture();

PAssert.that(p1).containsInAnyOrder(output.getUserReqList());

问题是:

  1. 如何在PAssert中使用自定义差异/比较功能?
  2. 如何从PCollection转换为List?

1 个答案:

答案 0 :(得分:0)

我知道现在这可能已经太旧了,但是我发现了解决问题的复杂方法。 我找到了一种编写自定义可序列化函数的方法,该函数可充当满足函数。

对于您的用例,请如下编写PAssert

PAssert.that(p1).satisfies(PCollectionSatisfies.forExpectedList(p2));

并将满意度函数实现为

public class PCollectionSatisfies {

  public static <T> SerializableFunction<Iterable<T>, Void> forExpectedList(ImmutableList<T> expected) {

    return (SerializableFunction<Iterable<T>, Void>)
        input -> {
          Truth.assertThat(input).containsExactlyElementsIn(expected).inOrder();
          return null;
        };
  }

  public static <T> SerializableFunction<T, Void> forSingleton(T expected) {
    return (SerializableFunction<T, Void>)
        input -> {
          Truth.assertThat(input).isEqualTo(expected);
          return null;
        };
  }
}

希望有帮助。