1

我有一个类似于下面的代码来转换协议缓冲区消息的 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?
4

1 回答 1

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;
        };
  }
}

希望有帮助。

于 2020-09-13T18:22:42.267 回答