测试等于RDD,同时使用Mockito定义模拟的行为



我正在使用Mockito为一些java Spark程序编写单元测试,当我尝试定义模拟对象的方法的行为时遇到问题,例如:

when(mock.method(someRDD)).thenReturn(0);

由于RDD不会重新实现equals((函数,因此模拟行为仅工作,方法中传递的rdd与"someRDD"的引用相同。

我想知道是否有任何方法可以在模拟方法中自定义 Mockito 中的"equals(("检查行为? 或者也许我应该使用其他一些模拟框架?

您可以编写自己的ArgumentMatcher来关联传递的参数和预期内容。假设这只是RDD字段之间的直接比较,您可以使用Mockito内置的refEq匹配器,该匹配器使用反射并单独比较每个字段:

when(mock.method(refEq(someRDD))).thenReturn(0);

看看这个 https://github.com/holdenk/spark-testing-base,用Spark rdds进行测试。另外,这里有一个关于如何使用它的教程。http://www.jesse-anderson.com/2016/04/unit-testing-spark-with-java/

这将完成您正在寻找的。通常测试将如下所示...

    JavaRDD<A> inputRdd = jsc().parallelizePairs(inputData);
    JavaRDD<B> transformedRdd = someMethod(inputRdd);
    JavaRDD<B> expectedRdd = jsc().parallelize(expectedData);
    JavaRDDComparisons.assertRDDEquals(transformedRdd, expectedRdd);

但是,请注意,据我所知,可能会与您可能正在使用的 glassfish 版本或其他 maven 依赖项发生冲突。为了解决这个问题,我将测试保存在一个单独的项目中。

编辑:如果测试配对RDD,则需要添加这样的标签...

    ClassTag<Tuple2<K, V>> tag = scala.reflect.ClassTag$.MODULE$.apply(Tuple2.class);
    JavaRDDComparisons.assertRDDEquals(JavaRDD.fromRDD(JavaPairRDD.toRDD(transformedRdd), tag),
                                       JavaRDD.fromRDD(JavaPairRDD.toRDD(expectedRdd), tag));

相关内容

  • 没有找到相关文章

最新更新