使用Mockito时,我只使用它来模拟依赖关系,即我的工作流看起来大概如下:
我有一个依赖的类:
public class C { public C (A a,B b) { this.a = a; this.b = b; } public String fooBar() { return a.foo() + b.bar(); } }
在我的测试类中,我模拟了这些依赖项,并告诉它们在调用某些指定方法时返回哪些值:
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")); } }
(我希望这个例子不是太简单或太衍生;-)).这很好用,它允许我单独测试类(这里:C).尽管如此,我从不使用Mockito的验证方法或其他任何功能.以这种方式使用Mockito可以/足够吗?
解决方法
验证通常用于检查您的C是否真正调用A.foo()和B.bar()方法.所以你可以添加
verify(a).foo(); verify(b).foo();
在断言之前或之后.我不认为您需要或应该在这里使用它们,但有几种情况您需要:
> a或b执行c的公共API不可见/可访问的内容(例如日志记录)>您关注的是执行顺序>你想确保只调用a.foo和b.bar方法,而不是像a.foo2那样>你可以使用那些模拟作为间谍,然后调用a.foo然后将路由到aReal.foo