2017-05-26 13 views
3

とモックの振る舞いを定義しながら、テストは私のような嘲笑オブジェクトのメソッドの振る舞いを定義しようとしたとき、私はMockitoといくつかのjavaスパークプログラムのためのユニットテストを書いています、私は問題を抱えてRDDのために等しい:Mockito

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

RDDはequals()関数を再実装しないので、模擬動作はメソッドで渡されるrddだけがこの "someRDD"と同じ参照です。

モッキングメソッドでMockitoの "equals()"チェック動作をカスタマイズする方法があるのだろうか?代わりに他のモックフレームワークを使うべきでしょうか?

+0

は、比較してみてくださいその後、RDDの最初のアクションを作ってみると、 Javaオブジェクトを取得します。 –

+0

テスト対象関数の疑似インタフェースは、引数としてRDDを使用します。単純にMapにすることはできません。 – Vulcann

答えて

1

あなたが渡された引数と何を期待するの間で相関するArgumentMatcher自分自身を書くことができます。それはRDDのフィールド間だけでストレートな比較だと仮定すると、あなたはMockitoの反射を使用し、単に個々のフィールドを比較しrefEqマッチャーで構築を使用することができます。

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

私はこれを試します、ありがとう。 – Vulcann

1

この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の依存関係のバージョンとの衝突があることができ、ということに注意してください...次のようになります。これを回避するために、テストを別のプロジェクトに保管しました。

EDIT:あなたがそうのようなタグを追加する必要があり、試験ペアRDDS場合...

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)); 
+0

この情報は面白いです、ありがとう。しかし、それは私の問題をほとんど解決することはできません、私は私の同等テストコードをmockitoテストフレームワークに注入することはできません。 – Vulcann

+0

ああ、ありがとう、ごめんなさい – SiLaf

+1

ごめんなさい、私はあなたの返事にとても感謝しています。 – Vulcann