假设您有三个课程A
,B
和C
,A
调用B
和B
来电C
并且每个类都有一些内部状态,这些状态会影响类的方法给出的结果。描述如何使用Mockito可以大大减少A类测试用例的数量。
我是mockito的新手。我有点得到了mockito的概念但偶然发现了上面没有答案的问题。有人可以向我解释答案吗?
由于
答案 0 :(得分:3)
Mockito可以帮助你隔离一个班级'行为,而不必知道合作班的内部运作。
假设C
看起来像这样:
public class C {
private B b;
public C (B b) {
this.b = b;
}
public boolean isLargerThanTen() {
return b.getSomeCalculation() > 10;
}
}
现在假设您正在测试C.isLargerThanTen()
。如果没有嘲笑,您必须知道如何构建B
以使其getSomeCalculation()
返回这样的数字。 E.g:
A a = new A();
a.setSomething(1);
a.setSomethingElse(2);
B b = new B(a);
b.setAnotherThing(999);
b.setYetAnotherThing(888);
C c = new C(b);
assertTrue(c.isLargerThanTen());
这在两个方面存在问题 - 首先,它很麻烦。其次,它会让您了解B
的内部运作情况(在这种情况下,A
,B
也依赖于B
)。如果C
要更改其实施,C
的测试会中断,即使B
没有任何问题,只有(错误的)方式测试已设置。
相反,如果你使用模拟,你可以模拟你关心的行为的唯一部分,而无需理解B b = Mockito.mock(B.class);
Mockito.when(b.getSomeCalculation()).thenReturn(11);
C c = new C(b);
assertTrue(c.isLargerThanTen());
的内部实现细节:
{{1}}
答案 1 :(得分:2)
这听起来像家庭作业,但使用像Mockito这样的模拟框架的优势在于它允许您在执行测试时完全分离每个组件的功能。也就是说,您只需要测试A
提供的界面和可能的场景(各种输入等),因为您可以控制模拟B
和C
类的操作。
例如,如果您需要在A
中测试错误处理,您只需让您的模拟B
对象抛出异常,而不必在B
中实际生成错误条件否则会引发异常。
简短的回答是因为它可以让您更好地控制被测试的类(以及该类的依赖项)并允许您模拟真实世界的条件,否则这些条件会产生更多代码