Mockito:如何验证在方法中创建的对象上调用了方法?

新手上路,请多包涵

我是 Mockito 的新手。

给定下面的类,我如何使用 Mockito 来验证 someMethod 在调用 foo 之后恰好被调用一次?

 public class Foo
{
    public void foo(){
        Bar bar = new Bar();
        bar.someMethod();
    }
}

我想拨打以下验证电话,

 verify(bar, times(1)).someMethod();

其中 barBar 的模拟实例。

原文由 mre 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 369
2 个回答

依赖注入

如果您注入 Bar 实例或用于创建 Bar 实例的工厂(或其他 483 种方法之一),您将拥有执行测试所需的访问权限。

工厂示例:

给定一个这样写的 Foo 类:

 public class Foo {
  private BarFactory barFactory;

  public Foo(BarFactory factory) {
    this.barFactory = factory;
  }

  public void foo() {
    Bar bar = this.barFactory.createBar();
    bar.someMethod();
  }
}

在您的测试方法中,您可以像这样注入一个 BarFactory:

 @Test
public void testDoFoo() {
  Bar bar = mock(Bar.class);
  BarFactory myFactory = new BarFactory() {
    public Bar createBar() { return bar;}
  };

  Foo foo = new Foo(myFactory);
  foo.foo();

  verify(bar, times(1)).someMethod();
}

奖励:这是 TDD(测试驱动开发)如何驱动代码设计的示例。

原文由 csturtz 发布,翻译遵循 CC BY-SA 4.0 许可协议

经典的回答是,“你不知道。”您测试 Foo 的公共 API,而不是其内部。

Foo 对象(或不太好,环境中的其他对象)是否有受 foo() 影响的任何行为?如果是这样,请测试一下。如果不是,该方法有什么作用?

原文由 Michael Brewer-Davis 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题