Mockito - 感觉我没有充分利用它的潜力

hel*_*hod 6 java junit mockito

当使用Mockito时,我只使用它来模拟依赖关系,即我的工作流看起来像这样:

我有一个依赖的类:

public class C {
    public C (A a, B b) {
        this.a = a;
        this.b = b;
    }

    public String fooBar() {
        return a.foo() + b.bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的测试类中,我模拟了这些依赖项,并告诉它们在调用某些指定方法时返回哪些值:

public class CSpec {
    private A a = mock(A.class);
    private B b = mock(B.class);

    @Test
    public itShouldReturnFooBar() {
        when(a.foo()).thenReturn("foo");
        when(b.bar()).thenReturn("bar");

        C c = new C(a, b);

        assertThat(c.fooBar().isEqualTo("foobar"));
    }
}
Run Code Online (Sandbox Code Playgroud)

(我希望这个例子不是太简单或太衍生;-)).这很好用,它允许我单独测试类(这里:C).尽管如此,我从不使用Mockito的verify方法或其他任何功能.以这种方式使用Mockito可以/足够吗?

ver*_*tti 5

验证通常用于检查您是否C真正调用A.foo()和B.bar()方法.所以你可以添加

verify(a).foo();
verify(b).foo();
Run Code Online (Sandbox Code Playgroud)

在断言之前或之后.我不认为您需要或应该在这里使用它们,但有几种情况您需要:

  • a或b执行从c的公共API不可见/可访问的内容(例如日志记录)
  • 您关注执行的顺序
  • 你想确保 调用a.foob.bar方法,没有别的a.foo2
  • 你可以使用那些模拟作为间谍,a.foo然后调用将被路由到aReal.foo

  • 在你非常简单的情况下,是的,但在很多情况下,检查在执行复杂方法时确实调用了某些内容正是你想要的. (2认同)
  • 不要在这样的测试中使用`verify`.你正确地测试`foobar`返回正确的值.另一方面,如果`foo`和`bar`没有返回值,或者你没有以任何方式使用这些值,那么你可能想要使用`verify`来检查它们是否实际调用了.通常,测试将验证发生了什么,或者对返回值进行断言 - 如果你最终同时做两件事,你很可能试图在一个测试方法中测试太多东西. (2认同)