当我使用Easymock(或类似的模拟框架)来实现我的单元测试时,我不得不进行基于交互的测试(因为我没有断言我的依赖状态。或者我错了?)。
另一方面,如果我使用手写存根(而不是使用easymock),我可以实现基于状态的测试。
我不清楚我是否想要进行基于交互的测试或基于状态的测试。
我有偏见,我想使用Easymock,但我不确定将来是否会有任何副作用。
任何人都可以对此有所了解吗?
提前致谢!
答案 0 :(得分:4)
您必须将对象划分为域值对象(包含状态且应该是不可变的)和服务。服务是其他对象应该要求执行特定任务的内容,但您的代码不应该关心如何执行此任务。要在不测试其对等体的情况下单独测试服务,请使用模拟。
可能永远不会嘲笑可能包含计算等域功能的值对象,因为它们的责任在于计算而不是委托。
在设计良好的系统中,应始终注入服务,不要从其他服务返回服务,因此一般来说,模拟不应该返回模拟。
答案 1 :(得分:0)
我认为单元测试概念被高估了。我非常喜欢自动化测试的想法,但我不喜欢你只测试一个单元而不是系统/子系统的人为要求。
也就是说,当对象本身构建为通过接口和与所述依赖项交互时,您应该测试交互。几乎可以肯定,该接口有/将会有不同的实现。在这种情况下,您真的想要从考虑中删除特定接口实现的任何实现细节。
但是,如果有一个接口,但只是“只是在未来扩展的情况下” - 即在可预见的未来没有第二次实现时,我会说可以将对象与唯一存在的依赖项一起测试实现。正确模拟界面所需的额外工作可能会带来更多的错误而不是好处。
答案 2 :(得分:0)
你没有理由不能同时做到这两点。我发现使用模拟的基于行为或基于交互的测试可以节省大量的样板,而您只需要测试行为。使用手写的存根,你最终会得到很多布尔值,表明你需要调用一个方法然后进行测试。这是多余的,脆弱的,非常拖累。
另一方面,有时你确实想测试状态。例如,如果测试对象的行为需要根据候选模型或存根的状态进行更改,并且需要进行一些复杂的交互。
在这种情况下,模拟框架可能会妨碍,并且手写存根可以更轻松地管理状态以进行测试。
所以底线是它们不是互斥的 - 使用对给定测试有意义的东西。只要每个测试都很小并只测试一件事(尽可能合理),那么你不应该发现自己处于开始使用模拟的情况下突然发现你必须做一些努力才能恢复原状到存根。