0

我开始使用 java Mockito 框架和模拟概念。您能向我解释如何测试这个基本场景吗?

有一个用例 A,它有一个公共方法(计算)和几个私有/受保护的方法。在计算中间的某个地方,另一个用例称为 (B)。为了调用 B,必须准备很多参数。B 也产生相当复杂的输出。我想以这样一种方式准备测试,以便我能够用我自己的存根替换对 B 的实际调用——这是非常微不足道的情况。但是,A 只有一个公共方法计算,我不希望在同一个包中进行测试以访问受保护的方法。重新设计类 A 可能带来的麻烦多于缓解 - 它不是我设计的,代码的不同部分之间存在一些关系,这使得使用公共方法创建新类有点奇怪。

你能告诉我一些建议或指出一些读物吗?

4

2 回答 2

1

为了使用 Mockito(或任何其他模拟框架)用您自己的替换实际的 B,您必须能够通过创建构造函数手动注入 B

public A(B b) { localB = b; }

通过创建一个方法

public void setB(B b) { localB = b; }

或者通过使用一些自动注入框架。

但是,如果 B 被完全封装和隐藏并且无法更改,那么您可以针对 B 编写测试以显示给定的已知输入 B 返回预期的输出

然后针对 A 进行测试,即给定已知输入 A.calculate() 是否给出预期输出。

如果您可以证明 B 的行为符合预期并且 A 的行为符合预期,那么您不需要显式地证明 A 正确地调用了 B,因为您正在隐式测试它。


已编辑,因为@david wallace 的咖啡比我少或睡眠多!

您不必注入模拟B。如果有帮助,您可以注入实际的 B,但首先创建一个间谍 a.getB();

B spyB = spy(new B());
//maybe stub the method return here    
A a = new A(spyB);
a.calculate();
verify(spyB).complicatedThingForCalculate("a", "lot", "of", "specified", "parameter");

进一步编辑:正如评论中指出的那样,使用 Mock 比使用间谍要好得多。从文档中:

真正的间谍应该小心谨慎地偶尔使用,例如在处理遗留代码时。

所以我把它包括在这里,因为你说你不想/有自由改变 A 和 B。

于 2012-10-01T17:18:41.680 回答
0

据推测,您的 A 类创建了 B 类的实例。这总是会导致可测试性问题,因为很难让它创建一个模拟实例。处理此问题的一个非常好的方法是允许为 B 类注入工厂类。这是我关于此主题的 wiki 帖子中的“模式 2”

于 2012-10-01T18:27:10.367 回答