这是Mockito间谍的正确案例吗?

时间:2010-09-11 20:03:47

标签: java unit-testing mockito

假设我有一个班级

class SomeClass
{
  public void methodA()
  {}

  public void methodB()
  {}

  public void someMethod()
  {
     methodA();
     methodB();
  }
}

我想用Mockito测试someMethod()的行为。

我能想到的唯一方法是使用spy();

这样的东西
SomeClass someClass = spy(new SomeClass());
someClass.someMethod();
InOrder inOrder = inOrder(someClass);
inOrder.verify(someClass).methodA();
inOrder.verify(someClass).methodB();

我是模拟人员和文档的新手

“应该谨慎使用真正的间谍,例如在处理遗留代码时。”

所以也许我错过了一些东西,并且有更好的(正确的)方法来验证方法A和方法B是否被调用而没有在测试用例中明确地调用它们。

感谢。

2 个答案:

答案 0 :(得分:6)

是的,spy()适合您的目的。警告是由于实际方法被调用,因此您可能会得到意想不到的结果(例如 - 从银行账户中提取真实货币)

答案 1 :(得分:0)

如果你的代码需要间谍进行单元测试 - 那就错了。 间谍是代码气味的第一个标志。 在您的示例中,您有两种方法可以避免它:

  1. 你可以避免模仿其中一个方法并测试整个someMethod。
  2. 如果确实需要模拟methodA和methodB - 你可以将它们移到单独的类等。