【问题标题】:Mock object did not update value模拟对象没有更新值
【发布时间】:2015-07-06 11:12:22
【问题描述】:

我正在设置这样的 int 值:

when(status.getCurrentSeq()).thenReturn(0);

当测试用例运行时,代码逻辑将 CurrentSeq 的值设置为 1。

status.setCurrentSeq(1)

currentSeq 仍然是模拟对象中的0。再次获取status.getCurrentSeq() 总是返回0

【问题讨论】:

  • 好像你在混合模拟行为和真实行为。
  • 也许您可以向我们展示整个单元测试并尝试解释您要测试的确切行为。
  • 它是一个递归。在更新值的基础上,执行下一个逻辑。如果它没有从 0 更新到 1;然后每次执行相同的逻辑并且代码永远运行。

标签: java unit-testing junit mocking mockito


【解决方案1】:

您不能在模拟对象上设置值。它仍然会返回它被嘲笑返回的东西。在这种情况下为 0。

如果您不希望该方法返回 0,为什么还要模拟该方法以返回 0? 也许完全删除 when(status.getCurrentSeq()).thenReturn(0); 可以解决您的问题。

编辑: 也许你需要存根连续调用?

when(status.getCurrentSeq())
  .thenReturn(0)
  .thenReturn(1);

也可以这样缩短:

when(status.getCurrentSeq())
  .thenReturn(0,1);

可以通过以下方式验证此行为:

assertEquals(0, status.getCurrentSeq());
assertEquals(1, status.getCurrentSeq());
assertEquals(1, status.getCurrentSeq());

第一次调用模拟方法时返回 0,每次连续调用时返回 1。

【讨论】:

  • 它是一个递归。在更新值的基础上,执行下一个逻辑。如果它没有从 0 更新到 1;然后每次执行相同的逻辑。
  • 我仍然不清楚你为什么需要模拟它?
  • 你的意思是我不应该模拟这个对象吗?使用 Mockito 是编写测试用例的好习惯。
  • 是的,我同意这是一个很好的做法,但有时人们会过度使用它,如果一切都被嘲笑,则根本不会测试任何逻辑。 :) 这就是为什么我认为查看您的确切测试用例是个好主意。看看我的编辑,也许这会有所帮助。
  • 连续调用没有帮助。它总是返回 1。但我需要它第一次返回 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2017-10-17
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多