Mockito的基本嘲弄场景

时间:2012-10-01 16:59:22

标签: java testing mocking mockito

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

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

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

2 个答案:

答案 0 :(得分: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华莱士的咖啡比我更少或更多睡眠!

你没有 注入模拟 B.如果有帮助你可以注入实际的B但是create a spy a.getB(); < / p>

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");

进一步编辑: 正如评论中指出的那样,使用模拟而不是间谍会更好。来自文档:

  

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

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

答案 1 :(得分:0)

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