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

2022-08-31 04:34:26

我是Mockito的新手。

给定下面的类,我如何使用 Mockito 来验证在被调用后只被调用过一次?someMethodfoo

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

我想拨打以下验证电话,

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

其中 是 的模拟实例。barBar


答案 1

依赖注入

如果您注入 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(测试驱动开发)如何驱动代码设计的一个例子。


答案 2

经典的回答是,“你没有。测试 的公共 API,而不是其内部。Foo

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


推荐