0

我对 Mockito 很陌生,如果我走在正确的轨道上,请告诉我。我正在尝试使用 Mockito 模拟方法功能。

sscce

public SUTclass {
    private final DependencyInjectedObj dep; // already successfully mocked
    private int statefulInteger;
    private int otherInteger;

    public int doSomething() {
        return otherInteger + dep.doMath(statefulInteger);
    }
}

现在,dep被嘲笑......但dep.doMath总是返回0。在生产中,dep是有状态的——没有办法避免它。在生产中,不同的线程实时更新其状态。dep.doMath根据现在的状态进行一些时髦的计算。您可以想象生产功能可能会查看温度计并使用它的温度做一些事情,并doSomething根据该温度提供实时状态。

不过,在我的测试中,我希望dep.doMath拥有这个功能(这对于单元测试来说是足够的近似值):

public int doMath(int input) {
    return SOMECONSTANT * input;
}

我想我可以创建一个 Mock 实现DependencyInjectedObj并使用它,但这似乎违背了使用 Mockito 和when语法的目的。我应该怎么办?

4

1 回答 1

3

在这种情况下,您想要的是doAnswer(). 它允许您在调用模拟调用时执行任意代码:

doAnswer(new Answer<Integer>() {
  public Object answer(InvocationOnMock invocation) {
      Object[] args = invocation.getArguments();
      int i = (int)args[0];
      return i * CONSTANT;
  }
}).when(dep.doMath(any(Integer.class));

不过,我确实认为doAnswer有点邪恶。通常thenReturn(CONSTANT)对于大多数单元测试来说已经足够了。如果您要验证此方法调用的结果,那么您正在测试错误的类——模拟您的依赖关系的重点是您不太关心它们的操作。

于 2013-06-17T14:51:24.903 回答