【问题标题】:One when for two consecutive method calls in Mockito?一次在 Mockito 中连续两次调用方法?
【发布时间】:2013-02-03 21:17:00
【问题描述】:

当我使用 Mockito 编写单元测试时,我经常会发现我在一个注入的 mock 上调用了一个 getter,然后从返回的对象中调用一个方法。

到目前为止,我已经做了这样的事情:

    @Mock
    private Randomizer r;
    @Mock
    private Random random;
    @InjectMocks
    private NodeGenerator ng = new NodeGenerator();

    @Test
    public void nodeIsDuplicate() {

        when(r.getRandom()).thenReturn(random);
        when(random.nextInt(2)).thenReturn(1);
        [...]
    }

但不得不模拟随机数并为它设置第二个时间似乎是一种浪费。有什么方法可以让我的 when 语句更像:

when(r.getRandom().nextInt(2)).thenReturn(1);

不必模拟随机数,所以我可以只用我的 Randomizer 模拟在一行上完成所有操作?

【问题讨论】:

标签: java junit mockito


【解决方案1】:

你想要 Mockito 的 One liner stubs

编辑:

仔细检查后,这可能不是您正在寻找的内容,但它可以为您减少一些样板代码。

您正在寻找的是,正如评论所暗示的那样,deep stubs

对于您的示例,它将是:

Randomizer randomizer = mock(Randomizer.class, RETURNS_DEEP_STUBS);

when(randomizer.getRandom().nextInt(2)).thenReturn(1);

【讨论】:

  • 是的,我只是根据评论的链接弄清楚了。实际上,我需要做的就是为注释添加:@Mock(answer = Answers.RETURNS_DEEP_STUBS),它神奇地起作用了!很酷。
  • 请注意有关违反得墨忒耳定律的警告。
  • 感谢您的建议。不过,这只是一个个人项目,所以我有时会忽略一些我在为工作编码时会遵循的 OO 设计原则。
  • 在这种特定情况下,我想如果我想用不是 Java 的 Random 类的随机数生成器替换 Randomizer 的随机数生成器,那会导致一个相当大的问题,但我无法想象想要无论如何都要替换它。
  • 如果你的单元不使用 Randomizer,除了获取 Random,你为什么不注入 Random 实例,而不是 Randomizer。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多