Robolectric:如何设置我希望Calendar类返回的时间?

And*_*der 2 android unit-testing mocking robolectric

我已经开始使用单元测试,但我仍然不知道如何测试某些东西.我的应用程序有一个接收2个参数的方法,即场地的开放和关闭时间,如果场地在当前时间打开则返回true,否则返回false.在内部,该方法用于Calendar c = Calendar.getInstance();获取当前时间.要正确测试该方法,我希望Calendar类返回的设置时间如何?我知道在Microsoft Fakes框架中有一些叫做shims伪造系统类返回值的东西.你知道Robolectric框架中的任何类似技术吗?

小智 5

Robolectric用一些所谓的影子类取代了一些框架类.这些类通常允许指定它们的行为,以便测试使用原始框架类的代码.

在这种情况下,您要查找的影子类称为ShadowSystemClock,它具有setCurrentTimeMillis(),您可以使用它来指定Calendar使用的currentTimeMillis()的返回值.

有点像:

ShadowSystemClock shadowClock = Robolectric.shadowOf(SystemClock.class);
shadowClock.setCurrentTimeMillis(1424369871446); // 18:17:51 UTC Feb 19 2015
Run Code Online (Sandbox Code Playgroud)

应该适合你.

编辑:

现在ShadowSystemClock可以直接访问方法,因为它们现在是静态的.更新的设置时间的方式是:

ShadowSystemClock.setCurrentTimeMillis(1424369871446); // 18:17:51 UTC Feb 19 2015
Run Code Online (Sandbox Code Playgroud)

正如本期引用的那样 - 在Robolectric中没有拦截对java.lang.System的调用

上述代码的效果在其他方法上很明显,例如:

ShadowSystemClock.currentTimeMillis();
SystemClock.currentThreadTimeMillis();
Run Code Online (Sandbox Code Playgroud)

截至目前,在System.currentTimeMillis()上述链接问题的状态发生变化之前,没有简单的方法来模拟响应.

  • @Edward @KamranAhmed,这对我不起作用。我设置了`ShadowSystemClock.setCurrentTimeMillis(1424369871446);`然后调用`Calendar.getInstance()。getTimeInMillis()`并返回实时信息。有人可以帮我吗? (2认同)