2016-06-01 9 views
1

mapreduce2を使用してアプリケーションを作成し、MRUnit 1.1.0を使用してテストしています。テストの1つでは、現在のシステム時間を出力する減速器の出力を確認しています。私。減速機が実行される時点で、タイムスタンプはcontext.write()で使用され、残りの出力とともに書き込まれます。今では、私が減速機で使用する方法と同じ方法をテスト方法で使用しても、両方で計算された時間は通常2016-05-31 19:10:022016-05-31 19:10:01のように2番目に離れています。したがって、2つの出力が異なる場合があります。例:MRUnitを使用してテストする前に出力を調整する

test_fe01,2016-05-31 19:10:01 
test_fe01,2016-05-31 19:10:02 

これはアサーションエラーの原因となります。このタイムスタンプの違いを無視したいので、タイムスタンプ以外の残りの出力が一致した場合にテストに合格します。私はハードコーディングされた値が返されるように、システム時間を返すために使用されるメソッドを模擬する方法を探しています、そして、減速器とテストの両方は、テスト中にこの模擬メソッドを使用します。これは可能ですか?どんな助けもありがとう。

よろしく

EDIT:私はすでに私のテストではMockitoのスパイ機能を試してみました:

MClass mc = Mockito.spy(new MClass()); 
Mockito.when(mc.getSysTime()).thenReturn("FakeTimestamp"); 

はしかし、これは、ランタイムエラーを与える:

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
    when(mock.getArticles()).thenReturn(articles); 

Also, this error might show up because: 
1. you stub either of: final/private/equals()/hashCode() methods. 
    Those methods *cannot* be stubbed/verified. 
2. inside when() you don't call method on mock but on some other object. 
3. the parent of the mocked class is not public. 
    It is a limitation of the mock engine. 

方法getSysTime()はパブリックで静的であり、クラスMClassはパブリックであり、親クラスはありません。

答えて

1

あなたの質問を理解しているとすれば、設定オブジェクトを使用してReduceに時間を渡すことができます。あなたの削減では、この構成が設定されているかどうかをチェックして使用することができます。そうでない場合は、システム時間を使用します。

このようにすれば、テスト用に既知の値を渡して、同じ値を返すと主張できます。

+0

解決策のようですが、レデューサーにコードを追加しないとできませんか?このメソッドがハードコードされたタイムスタンプを返すように、自分のアプリケーションで実装されている 'String getSysTime()'メソッドを模擬して、私のテストで現在のシステム時刻を返したいと思います。 –

+0

あなたはあなたのレデューサーを拡張し、そのメソッドをオーバーライドするか、おそらくMockitoのようなものを使ってその特定のメソッドを模擬することができます:http://stackoverflow.com/questions/14970516/use-mockito-to-mock-some-methods-but-not-他の人 –

+0

このメソッドは私のレデューサークラスにはなく、タイムスタンプが返される長い呼び出しチェーンがあります。私が投稿した質問には抽象化と単純化がたくさんあります。構成ソリューションでは、チェーンに含まれるすべてのメソッドのパラメータリストにConfigurationオブジェクトを追加する必要があります。この解決策はうまくいくかもしれませんが、望ましくない複雑さと回帰がたくさんあります。私の場合の理想的な解決策は、私のテストでその特定のクラスの特定のメソッドをモックすることですが、どのように達成するかはわかりません。 –

関連する問題