Easymock使用日期期望

lcu*_*cuz 6 java easymock date

我正在使用easymock模拟一个方法,它的主体有一个日期,如下所示:

public void testedMethod() {
    ...
    if (doSomething(new Date())) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我的测试看起来像这样:

public void testThatMethod() {
    ...
    expect(testedClass.testedMethod(new Date())).andReturn(false);
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时,有时会出现这样的错误:

意外的方法调用testsMethod(Thu Jan 28 09:45:13 GMT-03:00 2010):testedMethod(Thu Jan 28 09:45:13 GMT-03:00 2010):预期:1,实际:0

我认为这是因为有时日期略有不同.我没有成功地尝试了一些灵活的期望.有办法解决这个问题吗?

小智 5

我们不断面临类似的问题,这些是我看到的替代方案:

  1. 将日期作为参数提供给方法 (+) 快速更改 (-) 有点脏 - 当您只想使用“now”时,它也会污染您的界面
  2. 从协作者“QueryCurrentDateProvider”(+) 中提取日期仍然很快 (+) 也可以模拟 -> 您确定您使用相同的日期 (-) 为每个需要执行类似操作的服务创建的不必要的协作者
  3. 编写您自己的 EasyMock 参数匹配器,在其中抽象出您实际想要做的事情 - 当您只对当天感兴趣,而不是您可以使用类似 Commons DateUtils.isSameDay 之类的东西来运行时(+)最干净的解决方案( +) 没有改变你的生产代码 (-) 你必须编写你自己的匹配器(虽然我不明白为什么 EasyMock 还没有)
  4. 将“new Date()”移动到一个私有方法,然后用类似 PowerMock 的东西来模拟这个方法(+)快速(+)对生产代码的小改动(-)引入 power mock 作为依赖
  5. 将参数从 Date 更改为 String 并在调用方法之前使用通用模式将日期转换为字符串 (+) quick (+) 无需额外代码,测试站点上需要库 (-) 您必须格式化日期在调用方法之前解析被调用方法中的日期

所以这真的取决于你的个人喜好。当您经常使用当前时间戳时,我会推荐参数匹配器 - 因为这项投资将很快得到回报。


Kal*_*ser 4

停止使用 new Date(),改用具有恒定时间的日历。

//Declare the Calendar in your test method
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(0l);

//receive the calendar to be used in testedClass constructor
public void testedMethod() {
    ...
    if (doSomething(cal.getTime())) {
    ...
}

//use the same calendar to make the assertion
public void testThatMethod() {
    ...
    expect(testedClass.(testedMethod(cal.getTime())).andReturn(false);
    ...
}
Run Code Online (Sandbox Code Playgroud)