调用SimpleDateFormat方法时模拟Date()

时间:2016-09-08 02:12:03

标签: java junit mocking mockito simpledateformat

在以下设置下

@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)

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

2 个答案:

答案 0 :(得分:1)

java.time

您正在使用麻烦的旧遗留日期时间类,现在由java.time类取代。

Clock

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

Clock甚至还附带了一些已经为您构建的备用实现。人们可以冻结到特定的固定时刻。另一个保留时间但从实际时间偏移指定的数量。其他人按整秒或整分钟或您指定的任何金额递增。

答案 1 :(得分:0)

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

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

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