Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要使用框架创建模拟对象,而不是创建对象本身_Java_Mockito - Fatal编程技术网

Java 为什么要使用框架创建模拟对象,而不是创建对象本身

Java 为什么要使用框架创建模拟对象,而不是创建对象本身,java,mockito,Java,Mockito,可能重复: 为什么要使用 MyObject myOb = Mockito.mock(MyObject.class); 什么时候可以直接使用: MyObject myOb = new MyObject(); public class MyObject(){ private String str; //getters and setters } 如果上面的对象变得更复杂&它与其他对象有依赖关系,我也需要为这些对象创建模拟对象。因此,如果需要将所有成

可能重复:

为什么要使用

MyObject myOb = Mockito.mock(MyObject.class);
什么时候可以直接使用:

MyObject myOb = new MyObject();

    public class MyObject(){
       private String str;
       //getters and setters
    }

如果上面的对象变得更复杂&它与其他对象有依赖关系,我也需要为这些对象创建模拟对象。因此,如果需要将所有成员都设置为测试对象,为什么不直接创建对象本身而不是使用框架模拟它呢?

只需比较您在示例中编写的行数即可。当然,您可以手动编写所有的模拟,但是您需要进行更多的键入,测试的可读性也会降低。

当您模拟某些东西时,您还可以断言某些事情发生了,比如您可以断言使用参数调用的方法等


你不能用具体的类来做这件事,如果你问这个问题,你从来没有遇到过一个复杂到需要模拟的测试场景。当然,如果您的类足够简单和独立,您可以通过简单地实例化它们来测试它们,那么您应该这样做

然而,在许多实际情况下,您希望测试依赖于其他类的类,而在单元测试场景中不可能(或不希望)实例化这些类。它们可能与外部服务或数据库通信。它们可能有一长串附加依赖项,您必须实例化它们


还要记住,单元测试是关于隔离特定的计算单元,并验证它们是否独立地工作。模拟是一种很好的方法,它允许您从测试中删除依赖项。有效地说“假设依赖项A返回Y,验证此方法返回X(并且使用这些参数调用依赖项A).

Because描述了Mockito在普通对象之上的功能。因为mock框架提供了比普通对象多得多的功能,表现力、存根、验证、回调等。在单元测试中,您现在更关注协作者之间的交互,这意味着您可以进一步测试不同的执行路径不同的场景,即它有助于覆盖您的代码。您可以用一个具体的类来实现这一点,但您必须手工编写逻辑。模拟框架确实很方便,但很多。您可以,但您必须为每个场景创建一个concete类。在我看来,模拟类更容易,因为您只有模拟你正在测试的场景,其他方法、属性等也可以被忽略,考虑你的对象有20种方法,但是你只感兴趣嘲笑一个(或者其中的一些)。创建一个模拟对象:还是1行,自己写:很多行。@Björn Pollex我在我的示例中写的行数是一样的-每行一行可能我误解了什么。看起来像是你在编写专门用作模拟的
MyObject
-类。假设你需要一个实现打开一个用于测试的接口,但您还没有接口(例如,您需要从正在为其编写测试的库的用户处进行回调)。这就是模拟可以帮助您的地方。您可以让模拟框架来处理,而不是只为测试编写实现。这就是我在回答中的意思。@Björn Pollex感谢您的澄清。我只是编写MyObject来展示它是如何实现的。+1代表“。。。测试的可读性会降低。”。我希望能够阅读测试,并在(something
)时查看我的所有存根(
)。然后返回(
something
);
)-并知道它是存根;然后是调用正在测试的任何内容的代码,然后是验证或断言(
验证(
something
).something();
),但如果我有大量的手动交互,而这些交互都不是明显的存根和验证,那么我的测试将更难理解。