可能的重复项:
什么是对象模拟,何时需要它?
为什么要使用
MyObject myOb = Mockito.mock(MyObject.class);
什么时候可以代替使用:
MyObject myOb = new MyObject();
public class MyObject(){
private String str;
//getters and setters
}
如果上面的对象变得更加复杂并且它依赖于其他对象,我也需要为这些对象创建模拟对象。因此,如果需要设置所有成员来测试对象,为什么不直接创建对象本身而不是使用框架来模拟它呢?
只需比较您在示例中编写的行数即可。当然,您可以手动编写所有模拟,但是您将进行更多的键入,并且您的测试将降低可读性。
当你模拟某事时,你也可以断言某些事情发生了,比如你可以断言一个方法被调用了参数等。
你不能使用具体类来做到这一点
如果你问这个问题,你从来没有遇到过一个复杂到需要嘲笑的测试场景。当然,如果您的类足够简单且隔离,您可以通过简单地实例化它们来测试它们,那么您应该这样做。
但是,在许多现实生活中,您希望测试依赖于其他类的类,在这些类中不可能(或不希望)在单元测试方案中实例化它们。可能是它们与外部服务或数据库通信。可能是它们有一长串您必须实例化的其他依赖项。
还要记住,单元测试是关于隔离特定的计算单元,并验证它们是否独立地运行。模拟是执行此操作的好方法,它允许您从测试中删除依赖项。有效地说"假设依赖项 A 返回 Y,验证此方法是否返回 X(并且使用这些参数调用依赖项 A)。