如何使用 JUnit 5 测试调用 Instant.now() 的代码?

Sas*_*ota 6 java junit mockito powermock junit5

我有一个看起来像这样的代码:

MyObject getMyObject() {
    Instant now = Instant.now();
    return myService.doSomething(now);
}
Run Code Online (Sandbox Code Playgroud)

我知道 JUnit 5 不支持 PowerMock,但我想知道至少对于日期等标准 API 是否有一个解决方案。

现在我正在嘲笑不正确的Instant实例Mockito.any(),因为如果我通过了错误,我的测试就不会失败Instant

Mac*_*ski 4

您可以将当前 Instant 的创建移至包级别方法:

MyObject getMyObject() {
    Instant now = getCurrentInstance();
    return myService.doSomething(now);
}

Instant getCurrentInstant(){
  Instant.now();
}
Run Code Online (Sandbox Code Playgroud)

然后在测试中您可以监视 SUT 并模拟该getCurrentInstant方法:

Sut sut = spy(new Sut());
doReturn(testInstance).when(sut).getCurrentInstant();

sut.getMyObject();
Run Code Online (Sandbox Code Playgroud)

如果您需要进一步阅读,这是我写的关于Mockito 间谍活动的文章。