【发布时间】:2021-02-25 21:46:12
【问题描述】:
我正在为一个严重依赖日历的类进行单元测试。我正在尝试模拟所有调用,以便我基本上可以将自己指定的系统时间插入到类中以进行一些日期时间逻辑测试。
这是我的第一次尝试:
Calendar fixedSystemCal = Calendar.getInstance();
fixedSystemCal.set(2021, Calendar.FEBRUARY, 22, 18, 0, 0);
PowerMock.mockStatic(Calendar.class);
EasyMock.expect(Calendar.getInstance()).andReturn(fixedSystemCal).anyTimes();
PowerMock.replay();
不幸的是,经过一番摸索,我发现这不起作用,因为日历对象在类内部发生了变异。由于这个模拟每次返回相同的日历,这是一个问题。例如:
Calendar firstCall = Calendar.getInstance(); //Feb 22
firstCall.add(Calendar.DATE, 5); //Feb 27
Calendar secondCall = Calendar.getInstance() // This is also Feb 27 now
有什么方法可以每次都取回不同的日历对象(对于任意数量的调用)?到目前为止,我发现的唯一解决方案就是像这样重复多次:
Calendar fixedSystemCal = Calendar.getInstance();
fixedSystemCal.set(2021, Calendar.FEBRUARY, 22, 18, 0, 0);
PowerMock.mockStatic(Calendar.class);
EasyMock.expect(Calendar.getInstance()).andReturn((Calendar) fixedSystemCal.clone()).andReturn((Calendar) fixedSystemCal.clone()).andReturn((Calendar) fixedSystemCal.clone());
PowerMock.replay();
我将在下一步中用 Java 时间替换此代码,但我需要进行功能性单元测试才能进行更改。
【问题讨论】: