【问题标题】:Mock Date() when you call SimpleDateFormat method [duplicate]调用 SimpleDateFormat 方法时模拟 Date() [重复]
【发布时间】:2016-09-08 02:12:02
【问题描述】:

在以下设置下

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class myTest {

我的 src 上有这个

DateFormat dataformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentdate = dataformat.format(new Date());

而且我知道 Date.getTime() 方法会被调用。

我在我的测试代码上试过这个。

final Date date = Mockito.mock(Date.class);
Mockito.when(date.getTime()).thenReturn(dateLongValue);

但是什么也没发生。 我也尝试过这样的模型

Mockito.when(date.format(new Date())).thenReturn(dateStringValue);

得到了

java.lang.NullPointerException
at java.text.DateFormat.format(DateFormat.java:346)

这可能很容易,但我没有运气。任何建议将不胜感激。

【问题讨论】:

  • 我怀疑解决方案是dataformat.format(new Date());
  • 检查下面的链接可能有用stackoverflow.com/questions/11887799/…
  • 到底是什么问题?这两行代码都可以在您的测试中使用,实际上不需要模拟任何东西。如果您想检查这是否有效,只需解析返回 currentdate 并检查它是否在现在的几毫秒内......?你到底想测试什么?

标签: java junit mocking mockito simpledateformat


【解决方案1】:

java.time

您正在使用麻烦的旧日期时间类,现在已被java.time 类所取代。

Clock

java.time 类允许您传递Clock 的替代实现以进行测试。

Clock 甚至还附带了一些已经为您构建的替代实现。可以冻结到特定的固定时刻。另一个保持时间但从真实时间偏移指定量。其他的以整秒、整分钟或您指定的任何数量递增。

【讨论】:

    【解决方案2】:

    这样做的“正确”方法:编写可测试的代码。并且直接调用 new 有时会导致难以测试的代码。然后人们需要拔出大的 PowerMock(ito) 锤子来解决这个问题。

    或者,考虑学习如何编写可测试的代码;开始here

    在您的情况下,您可以为您的测试代码提供一个小工厂,为您生成“当前”日期对象。您使用依赖注入将该工厂放入您的测试类中;为了测试,你模拟了那个工厂。导致需要模拟调用new

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多