单元测试:我需要模拟多少



我目前正开始进行单元测试,我不知道该嘲笑什么,不该嘲笑什么。我所理解的是,我要测试的类应该是完全隔离的,因此它只处理模拟。

例如,如果我有一个类,其中有一个方法,它调用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的另一个原因是测试错误处理。为此,您希望在代码中的某些点出现异常。mock框架提供了舒适的方法来实现这一点。

大多数时候。我将先编写较低级别的类代码,而不是模拟。当模块不在此包中开发或依赖于其他服务代码时,我将使用mock。

最新更新