1

mapreduce2 を使用してアプリケーションを作成し、MRUnit 1.1.0 を使用して同じものをテストしています。テストの 1 つで、「現在のシステム時刻」を出力に入れるレデューサーの出力をチェックしています。つまり、リデューサーの実行時に、タイムスタンプが使用されcontext.write()、残りの出力と共に書き込まれます。レデューサーで使用するのと同じ方法をテスト メソッドで使用してシステム時間を見つけたとしても、両方で計算される時間は通常、 と のように 1 秒離れてい2016-05-31 19:10:02ます2016-05-31 19:10:01。したがって、2 つの出力は異なることがわかります。例:

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

これにより、アサーション エラーが発生します。このタイムスタンプの違いを無視したいので、タイムスタンプ以外の残りの出力が一致すればテストはパスします。システム時間を返すために使用されるメソッドをモックする方法を探しています。これにより、ハードコードされた値が返され、リデューサーとテストの両方がテスト中にこのモックされたメソッドを使用します。これは可能ですか?どんな助けでも大歓迎です。

よろしくお願いします

編集:私はすでに私のテストで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はパブリックであり、親クラスはありません。

4

1 に答える 1

1

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

このようにして、テスト用に既知の値を渡し、同じ値が返されることをアサートできます。

于 2016-06-01T13:16:34.273 に答える