当我使用 Easymock(或类似的模拟框架)来实现我的单元测试时,我被迫进行基于交互的测试(因为我无法断言我的依赖关系的状态。或者我错了吗?)。
另一方面,如果我使用手写存根(而不是使用 easymock),我可以实现基于状态的测试。
我很不清楚我是要进行基于交互的测试还是基于状态的测试。
我有偏见,我想使用 Easymock,但我不确定我将来是否会面临任何副作用。
任何人都可以对此有所了解吗?
提前致谢!
当我使用 Easymock(或类似的模拟框架)来实现我的单元测试时,我被迫进行基于交互的测试(因为我无法断言我的依赖关系的状态。或者我错了吗?)。
另一方面,如果我使用手写存根(而不是使用 easymock),我可以实现基于状态的测试。
我很不清楚我是要进行基于交互的测试还是基于状态的测试。
我有偏见,我想使用 Easymock,但我不确定我将来是否会面临任何副作用。
任何人都可以对此有所了解吗?
提前致谢!
您必须将对象划分为域值对象(保持状态并且应该是不可变的)和服务。服务是其他对象应该要求执行特定任务的东西,但您的代码不应该关心该任务是如何执行的。要单独测试服务而不测试其对等点,请使用模拟。
永远不要嘲笑可能包含计算等领域功能的值对象,因为它们的职责是计算而不是委托。
在一个设计良好的系统中,服务应该总是被注入并且永远不会从其他服务返回,所以一般来说,模拟不应该返回模拟。
没有理由你不能两者都做。我发现当你只想测试行为时,使用 mocks 进行基于行为或基于交互的测试可以节省大量样板文件。使用手写存根,您最终会得到很多布尔值,表明调用了一个方法,然后您必须对其进行测试。这是多余的,脆弱的,相当拖累。
另一方面,有时您确实想测试状态。例如,如果被测对象的行为需要根据候选对象的状态进行更改以进行模拟或存根,并且需要解决一些复杂的交互。
在这种情况下,模拟框架可能会成为障碍,而手写的存根可以更轻松地管理状态以用于测试目的。
所以底线是它们不是相互排斥的——使用对给定测试有意义的东西。只要每个测试都很小并且只测试一件事(尽可能多),那么您就不应该发现自己处于从模拟开始的情况下,突然发现您必须付出很多努力才能恢复原状到一个存根。