mockito 如何帮助减少测试用例
How does mockito help in reducing test cases
假设您有三个 classes A
、B
和 C
,其中 A
调用 B
和 B
调用 C
并且每个 class 都有一定数量的内部状态影响 class' 方法给出的结果。描述使用 Mockito 如何显着减少 class A.
的测试用例数量
我是 mockito 的新手。我有点了解 mockito 的概念,但偶然发现了上述问题,我没有答案。有人可以给我解释一下答案吗?
谢谢
这听起来像是家庭作业,但使用像 Mockito 这样的模拟框架的好处是它允许您在执行测试时完全分离每个组件的功能。也就是说,你只需要测试 A
呈现的界面和可能的场景(各种输入等),因为你可以控制模拟的 B
和 C
class是的。
例如,如果您需要在 A
中测试错误处理,您可以简单地让模拟 B
对象抛出异常,而不必在 B
中实际生成错误条件否则会触发异常。
简短的回答是因为它可以让您更好地控制被测 class(以及 class 的依赖项)并允许您模拟真实世界的条件否则需要更多的代码来生成。
Mockito 可以帮助您隔离 class' 行为,而无需了解协作 class.
的内部工作原理
假设 C
看起来像这样:
public class C {
private B b;
public C (B b) {
this.b = b;
}
public boolean isLargerThanTen() {
return b.getSomeCalculation() > 10;
}
}
现在假设您正在测试 C.isLargerThanTen()
。不用mocking,你就得知道如何构造B
,使其getSomeCalculation()
returns这样的数字。例如:
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());
假设您有三个 classes A
、B
和 C
,其中 A
调用 B
和 B
调用 C
并且每个 class 都有一定数量的内部状态影响 class' 方法给出的结果。描述使用 Mockito 如何显着减少 class A.
我是 mockito 的新手。我有点了解 mockito 的概念,但偶然发现了上述问题,我没有答案。有人可以给我解释一下答案吗?
谢谢
这听起来像是家庭作业,但使用像 Mockito 这样的模拟框架的好处是它允许您在执行测试时完全分离每个组件的功能。也就是说,你只需要测试 A
呈现的界面和可能的场景(各种输入等),因为你可以控制模拟的 B
和 C
class是的。
例如,如果您需要在 A
中测试错误处理,您可以简单地让模拟 B
对象抛出异常,而不必在 B
中实际生成错误条件否则会触发异常。
简短的回答是因为它可以让您更好地控制被测 class(以及 class 的依赖项)并允许您模拟真实世界的条件否则需要更多的代码来生成。
Mockito 可以帮助您隔离 class' 行为,而无需了解协作 class.
的内部工作原理假设 C
看起来像这样:
public class C {
private B b;
public C (B b) {
this.b = b;
}
public boolean isLargerThanTen() {
return b.getSomeCalculation() > 10;
}
}
现在假设您正在测试 C.isLargerThanTen()
。不用mocking,你就得知道如何构造B
,使其getSomeCalculation()
returns这样的数字。例如:
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());