【问题标题】:How to test a code that invokes Instant.now() with JUnit 5?如何使用 JUnit 5 测试调用 Instant.now() 的代码?
【发布时间】:2019-10-16 20:01:10
【问题描述】:

我的代码看起来像这样:

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

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

现在我正在用Mockito.any() 模拟Instant 实例,这是不正确的,因为如果我通过错误的Instant,我的测试不会失败。

【问题讨论】:

标签: java junit mockito powermock junit5


【解决方案1】:

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

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

Instant getCurrentInstant(){
  Instant.now();
}

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

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

sut.getMyObject();

如果您需要进一步阅读,这是我在Mockito Spying 上写的一篇文章。

【讨论】:

  • 我不太确定它如何解决我的问题。如果我将Instant.now() 提取到新方法中,我将使用原始方法解决问题。但是现在我必须测试getCurrentInstant() 方法,我遇到了同样的问题。
  • 为什么你需要测试一些没有逻辑且不是公共方法的东西?
  • 它确实有逻辑,为什么你认为返回当前日期不是逻辑?一个人可以很容易地破坏该方法,并且没有任何测试会失败。
  • 你不应该在间谍上使用 when.then.. 因为你在过程中调用了真正的方法
  • 逻辑对我来说是一个条件语句、循环、对象状态的改变、异常被抛出......但我们在这里提取的实际上是一种吸气剂。此外,您无法可靠地测试当前日期检索。您必须依靠它工作并用有意义的名称包装它。另一件事为什么要测试 java 本地方法是否有效?
猜你喜欢
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
相关资源
最近更新 更多