当我使用mockito框架时,我通常只模拟被测试类(CUT)的合作者。
然而,我在"有效地使用遗留代码"中看到了有时编写UT的一种方式。
在一个方法中有太多逻辑的地方。
你会:
1) 提取一些逻辑代码到一个单独的方法
2) 继承CUT并覆盖此方法
3) 如果我们不想运行这个代码(它与我们的测试不太相关),模拟这个方法
然后我想我从来没有嘲笑过CUT中的方法,只有合作者。
你会嘲笑CUT的方法吗?
你会如何同时嘲笑CUT的方法和CUT的合作者?
是的,这有时确实是一件有用的事情。Mockito有间谍,允许模拟现有对象的一些方法。例如:
public class Foo {
public int bar() {
return baz() * 2;
}
protected int baz() {
// some computation you want to mock
}
}
你可以这样写一个bar()的测试:
// given
Foo foo = new Foo();
Foo spy = spy(foo);
doReturn(5).when(spy).baz();
// when
int result = spy.bar();
// then
assertEquals(10, result);
Mockito也有部分mock。Mockito javadoc中描述了所有内容。
完成上述操作并嘲笑合作者只需将被嘲笑的合作者传递给测试对象即可:
Collaborator mockCollaborator = mock(Collaborator.class);
Foo foo = new Foo(mockCollaborator);
Foo spy = spy(foo);
...