我正在使用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));