我目前正开始进行单元测试,我不知道该嘲笑什么,不该嘲笑什么。我所理解的是,我要测试的类应该是完全隔离的,因此它只处理模拟。
例如,如果我有一个类,其中有一个方法,它调用getAnyobject()
。然后调用它的anyObject.getId()
方法并存储它。在我的单元测试中,我编写了一个方法build()
,其中我创建了AnyObject
, anyObj
的实例。然后我用setId(01)
设置了一个ID。
在构建完所有内容后,我编写了一个测试方法。我在这里写:doReturn(anyObj).when(classUnderTest.theServiceIuse.getAnyObject())
。我这样做,因为我的测试会失败,如果serviceIuse.getAnyObject()
不能正常工作。除此之外,我还必须模拟AnyObject
类中的getID()
方法。因为我不想测试AnyObject
类。
这是真的吗,我需要mock这么多,或者它是不必要的,我甚至调用setID()
方法?
请记住这一点。如果代码是为了易于测试而编写的,那么mock就没有必要了。例如,你可以用空的实现覆盖这些方法。
这就是为什么几乎不需要mock pojo的原因;您可以简单地创建一个实例并使用它。当代码调用的方法"做得太多"(比如与数据库对话)或有太多依赖关系时,您需要mock。
一个典型的例子是测试业务Foo
。在实际代码中,Foo
需要其他服务来完成它的工作。对于测试,你只需要确保Foo
正确使用其他服务(即检查API是否被遵守);实际上,您不希望其他服务做任何事情。问题是你不能轻易地从测试中禁用服务(比如告诉Java"当方法formatHarddrive()
被调用时不要做任何事情")。
解决方法是为服务创建一个mock,然后以某种方式将其注入Foo
。mock只暴露了尽可能少的API。
大多数时候。我将先编写较低级别的类代码,而不是模拟。当模块不在此包中开发或依赖于其他服务代码时,我将使用mock。