我正在使用mapreduce2创建一个应用程序,并使用MRUnit 1.1.0进行测试。在其中一个测试中,我正在检查一个减速器的输出,该减速器将"当前系统时间"放入其输出中。也就是说,在reducer执行时,在context.write()
中使用时间戳,以便与其余输出一起写入。现在,尽管我在测试方法中使用与在减速器中使用的方法相同的方法来查找系统时间,但两者中计算的时间通常相差一秒,如2016-05-31 19:10:02
和2016-05-31 19:10:01
。因此,两者的输出结果不同,例如:
test_fe01,2016-05-31 19:10:01
test_fe01,2016-05-31 19:10:02
这会导致断言错误。我希望忽略时间戳中的这种差异,这样,如果除了时间戳之外的其余输出都匹配,测试就会通过。我正在寻找一种方法来模拟用于返回系统时间的方法,以便返回硬编码的值,并且reducer和test在测试期间都使用这种模拟方法。这样做可能吗?任何帮助都将不胜感激。
致以最诚挚的问候
编辑:我已经在测试中尝试了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
是公共的并且没有任何父类。
假设我理解您的问题,您可以使用配置对象将时间传递到Reduce中。在reduce中,您可以检查是否设置了此配置并使用它,否则您将使用系统时间。
通过这种方式,您可以传入一个已知的值进行测试,并断言您可以返回相同的值。