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

Android Robolectric:我如何设置希望Calendar类返回的时间?,android,unit-testing,mocking,robolectric,Android,Unit Testing,Mocking,Robolectric,我已经开始使用单元测试,但仍然不知道如何测试某些东西。我的应用程序有一个方法,可以接收2个参数,即场馆的开放时间和关闭时间,如果场馆在当前时间开放,则返回true,否则返回false。该方法在内部使用Calendar c=Calendar.getInstance()以获取当前时间。为了正确地测试该方法,我希望Calendar类返回的设置时间如何?我知道在MicrosoftFakes框架中有一种叫做的东西,它伪造了系统类的返回值。你知道Robolectric框架中有什么类似的技术吗?Robolec

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

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

在本例中,将调用您正在查找的shadow类,该类有一个setCurrentTimeMillis(),您可以使用它来指定Calendar使用的currentTimeMillis()的返回值

大致如下:

ShadowSystemClock shadowClock = Robolectric.shadowOf(SystemClock.class);
shadowClock.setCurrentTimeMillis(1424369871446); // 18:17:51 UTC Feb 19 2015
应该对你有用

编辑:

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

ShadowSystemClock.setCurrentTimeMillis(1424369871446); // 18:17:51 UTC Feb 19 2015
正如本期所引述—

上述代码对其他方法的影响显而易见,如:

ShadowSystemClock.currentTimeMillis();
SystemClock.currentThreadTimeMillis();

到目前为止,没有直接的方法来模拟System.currentTimeMillis()的响应,直到上面链接的问题的状态发生变化。

我所做的是下一步:

首先,我创建了一个类,它用日期包装交互,如本文所示:

然后我用Mockito模拟了返回今天(Date)的方法:

public void setMockDate(String mockDateString) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
  Date mockDate = sdf.parse(mockDateString);
  stub(mockDateProvider.getToday()).toReturn(mockDate);
} catch (ParseException parseException) {
  fail("Failure: Unable to parse test date string");
}}
然后可以指定方法将返回的日期


希望对别人有帮助

你找到解决办法了吗?我们遇到了同样的问题。如何在Roboeletric 3.0上使用它?
ShadowSystemClock.setCurrentTimeMillis(1424369871446)。所有的方法现在都是静态的。@Edward@KamranAhmed,这对我来说不起作用。我设置了ShadowSystemClock.setCurrentTimeMillis(1424369871446)然后调用
Calendar.getInstance().getTimeInMillis()
并返回实时。有人能帮我吗?