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
はパブリックであり、親クラスはありません。