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

时间:2015-10-22 07:59:58

标签: java spring unit-testing junit mockito

我目前正在开始进行单元测试,但我不知道要嘲笑什么,不知道什么。我的理解是我要测试的课程应该是完全孤立的,所以它只涉及模拟。

例如,如果我有一个包含方法的类,则调用getAnyobject()。然后它调用它的anyObject.getId()方法并存储它。在我的单元测试中,我编写了一个方法build(),我在其中创建了AnyObjectanyObj的实例。然后我用setId(01)设置了一个ID。

构建完所有内容后,我编写了一个测试方法。在那里我写道:doReturn(anyObj).when(classUnderTest.theServiceIuse.getAnyObject())。我这样做,因为我的测试会失败,如果serviceIuse.getAnyObject()无法正常工作。除此之外,我还必须模拟getID()类中的AnyObject方法。因为我不想测试AnyObject课程。

这是真的,我需要嘲笑这么多,还是我甚至不需要调用setID()方法?

2 个答案:

答案 0 :(得分:3)

记住这一点。如果编写的代码易于测试,则不需要进行模拟。例如,您可以使用空实现覆盖方法。

这就是为什么你几乎不需要模仿POJO;你可以轻松地创建一个实例并使用它。当代码调用“做得太多”(比如与数据库交谈)或具有太多依赖关系的方法时,你需要模拟。

典型案例是测试服务Foo。在实际代码中,Foo需要其他服务来完成其工作。对于测试,您只需确保Foo正确使用其他服务(即检查API是否遵守);你真的不希望其他服务做任何事情。问题是你不能轻易地从测试中禁用服务(比如告诉Java“在调用方法formatHarddrive()时不做任何事情。)

解决方法是为服务创建一个模拟,然后以某种方式注入Foo。模拟只暴露尽可能少的API。

模拟的另一个原因是测试错误处理。为此,您需要在代码中的某些点处出现异常。模拟框架可以通过舒适的方式实现这一目标。

答案 1 :(得分:-1)

大部分时间。我将首先编写低级类代码而不是模拟。当模块没有在这个软件包中开发或依赖其他服务代码时,我会使用mock。