IAm*_*aja 5 java bdd mocking mockito
我一直在阅读(并试验)几个Java模拟API,如Mockito,EasyMock,JMock和PowerMock.我出于不同的原因喜欢他们每个人,但最终还是决定了Mockito.但请注意,这不是一个关于使用哪个框架的问题 - 这个问题确实适用于任何模拟框架,尽管解决方案看起来会有所不同,因为API(显然)不同.
像许多事情一样,你阅读教程,按照例子,然后在沙箱项目中修改一些代码示例.但是,当真正使用这个东西的时候,你开始窒息 - 而这就是我.
我真的非常喜欢嘲笑的想法.是的,我知道关于嘲笑导致"脆弱"测试的抱怨,这些测试过于严重地与被测试的类相结合.但是在我自己实现这种认识之前,我真的想让嘲笑有机会看看它是否能为我的单元测试增加一些好处.
我现在正试图在我的单元测试中积极使用模拟.Mockito允许存根和嘲弄.假设我们有一个Car有getMaxSpeed()方法的对象.在Mockito中,我们可以像这样存根:
Car mockCar = mock(Car.class);
when(mockCar.getMaxSpeed()).thenReturn(100.0);
Run Code Online (Sandbox Code Playgroud)
这个"存根" Car对象总是100.0以我们汽车的最大速度返回.
我的问题是,在编写了一些单元测试之后......我所做的只是勾结我的合作者!我没有使用verify我可用的单一模拟方法(等)!
我意识到我陷入了" 顽固的心态 ",我发现它无法打破.所有这些阅读,以及在我的单元测试中使用模拟的所有这些兴奋......我想不出一个用于行为验证的用例.
所以我备份并重新阅读了Fowler的文章和其他BDD风格的文章,但我仍然只是"没有"获得测试双合作者的行为验证的价值.
我知道我错过了什么,我只是不确定是什么.有人可以给我一个具体的例子(甚至是一组例子!),比如使用这个Car类,并演示一个行为验证单元测试何时有利于状态验证测试?
提前感谢任何正确方向的推动!
好吧,如果被测试的对象使用计算值调用协作者,并且测试应该测试计算是否正确,那么验证模拟协作者是正确的做法。例子:
private ResultDisplayer resultDisplayer;
public void add(int a, int b) {
int sum = a + b; // trivial example, but the computation might be more complex
displayer.display(sum);
}
Run Code Online (Sandbox Code Playgroud)
显然,在这种情况下,您必须模拟显示器,并验证其显示方法是否已被调用,如果方法的参数为 2 和 3,则值为 5 add。
如果您对协作者所做的只是在不带参数的情况下调用 getter,或者使用作为测试方法的直接输入的参数来调用 getter,那么存根可能就足够了,除非代码可能从两个不同的协作者处获取值,并且您想要验证适当的值合作者已被呼叫。
例子:
private Computer noTaxComputer;
private Computer taxComputer;
public BigDecimal computePrice(Client c, ShoppingCart cart) {
if (client.isSubjectToTaxes()) {
return taxComputer.compute(cart);
}
else {
return noTaxComputer.compute(cart);
}
}
Run Code Online (Sandbox Code Playgroud)