您的测试不会测试您的任何代码。它测试 Mockito 是否正常工作。
当我介绍模拟的概念时,我举了一个例子:假设您构建了一个雷管,并且想要测试它。你当然可以将雷管与真正的炸弹一起使用,看看当你使用雷管时整个方块是否爆炸。但这不太实用。顺便说一句,也许你甚至没有可用的炸弹。也许您的同事仍在构建它。
所以你使用模拟炸弹。请注意重要的一点:要测试雷管,您需要使用模拟炸弹。不是模拟雷管。被嘲笑的是依赖性被测班级的。不是被测试的类本身。
什么是模拟炸弹?这只是一个假炸弹,没有任何作用。它所做的只是验证是否已被要求爆炸。所以测试雷管的代码如下:
// create a mock bomb:
Bomb mockBomb = mock(Bomb.class);
// create a real detonator, but tie it to the mock bomb:
Detonator detonator = new Detonator(mockBomb);
// test the detonator. Since it's tied to a mock bomb, the block
// won't explode
detonator.pressTheRedButton();
// check it the mock bomb has been asked to explode, as it should
// if the detonator works correctly
verify(mockBomb).explode();
现在,如果测试通过,您就知道使用的所有内部电路pressTheRedButton()
工作正常并最终让炸弹爆炸。所以你知道,当与真实炸弹一起使用时,按下红色按钮时真实炸弹也会爆炸。
现在让我们回到现实世界:您想要测试一个服务,而该服务使用一个 DAO,它需要一个数据库并填充数据才能正常运行。要测试您的服务,您可以简单地模拟 DAO,并验证它是否正常工作。模拟 DAO 也可以用作stub,即返回您告诉它在测试中返回的内容的对象,而不是实际查询数据库。这就是您在问题代码中所做的事情:您告诉模拟 MyClass 实例,当add()
以 2 和 2 作为参数调用,它应该返回 4。
这使得测试更容易设置、运行更快,并且独立于 DAO 的实际代码,而这不是您想要在服务的单元测试中测试的内容。