使用不同的 return 值模拟 public 静态方法

Mock a public static method with different return values

此代码应该检查一个小时是否已过,然后执行特定操作。为了模仿这一点,我在 JMockit 中模拟 ZonedDateTime class 并希望它是现在方法 (ZonedDateTime.now(ZoneOffset.UTC);) 到 return 在我的代码执行期间的两个不同值。我的第一次尝试涉及静态方法的以下模拟实现:

ZonedDateTime instantExpected = ZonedDateTime.now(ZoneOffset.UTC);
new Expectations(ZonedDateTime.class) {{
    ZonedDateTime.now(ZoneOffset.UTC);
    result = instantExpected;
}};

上面的代码确保每次调用函数时都在同一瞬间得到 returned,但它不允许我在函数调用一定次数后更改值。我想要类似于下面代码应该如何工作的东西。

ZonedDateTime instantExpected = ZonedDateTime.now(ZoneOffset.UTC);
new Expectations(ZonedDateTime.class) {{
    ZonedDateTime.now(ZoneOffset.UTC);
    result = instantExpected;
    times = 2; // the first two times it should return this value for "now"

    ZonedDateTime.now(ZoneOffset.UTC);
    result = instantExpected.plusHours(1L);
    times = 1; // the third time it should return this new value for "now"
}};

我如何模拟一个 public 静态方法并为同一个函数设置 return 不同的值?

在 Expectations 块中作为结果返回一个时间列表就完成了这项工作。

ZonedDateTime instantExpected = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime secondInstant = instantExpected.plusHours(1L);
List<ZonedDateTime> allTimes = new ArrayList<ZonedDateTime>();
allTimes.add(instantExpected);
allTimes.add(instantExpected);
allTimes.add(secondInstant);
new Expectations(ZonedDateTime.class) {{
    ZonedDateTime.now(ZoneOffset.UTC);
    result = allTimes;
}};