为了使用 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。