Java 完全模拟和部分模拟之间有什么区别?

Java 完全模拟和部分模拟之间有什么区别?,java,unit-testing,mocking,Java,Unit Testing,Mocking,我目前正在使用jUnit使用Mockito进行模拟,我偶然发现了部分模拟部分,您可以使用Mockito.spy部分模拟对象。我似乎不理解这个部分模拟的概念,因为我找不到我应该使用它的场景(因为它与一般的模拟非常相似) 有人能解释部分模仿与普通模仿有什么不同吗?如果可能,请提供示例 谢谢 部分模拟是指你把一个类当作一个正常的类,除非你想覆盖某些功能。 这对于与应用程序的其他部分通信的单元测试服务非常有用。通过重写调用应用程序其他部分的行为,您可以单独测试服务 另一个例子是组件与数据库驱动程序通信。

我目前正在使用jUnit使用Mockito进行模拟,我偶然发现了部分模拟部分,您可以使用Mockito.spy部分模拟对象。我似乎不理解这个部分模拟的概念,因为我找不到我应该使用它的场景(因为它与一般的模拟非常相似)

有人能解释部分模仿与普通模仿有什么不同吗?如果可能,请提供示例


谢谢

部分模拟是指你把一个类当作一个正常的类,除非你想覆盖某些功能。 这对于与应用程序的其他部分通信的单元测试服务非常有用。通过重写调用应用程序其他部分的行为,您可以单独测试服务


另一个例子是组件与数据库驱动程序通信。通过模拟将与驱动程序通信的部分,您可以在不需要数据库的情况下测试应用程序的该部分。

部分模拟是指您获取一个类并要求它正常运行,除非您希望覆盖某些功能。 这对于与应用程序的其他部分通信的单元测试服务非常有用。通过重写调用应用程序其他部分的行为,您可以单独测试服务

另一个例子是组件与数据库驱动程序通信。通过模拟将与驱动程序通信的部分,您可以测试应用程序的该部分,而无需拥有数据库。

来自:

有时,您可能只需要模拟类的某些方法并保持 他人的正常行为。这通常发生在你想要的时候 测试调用同一类中其他一些函数的方法。所以你想 保持测试方法的正常行为,并模仿其他方法

我有时会用它来模拟(复杂的或流程密集型的)私有方法,这些方法已经过充分测试

部分模拟可能非常方便,但我尽量避免它。

来自:

有时,您可能只需要模拟类的某些方法并保持 他人的正常行为。这通常发生在你想要的时候 测试调用同一类中其他一些函数的方法。所以你想 保持测试方法的正常行为,并模仿其他方法

我有时会用它来模拟(复杂的或流程密集型的)私有方法,这些方法已经过充分测试

部分模拟非常方便,但我尽量避免它。

部分模拟: 假设您有一个类,它为构造函数接受10个以上的参数(这不应该发生,但在本例中,让我们假设它会发生),创建整个对象是一件非常繁琐的事情。像mockito这样的框架允许您只使用您真正想要测试的对象部分。 比如说


@模拟大类大类//包含大量属性

when(big.getAttributeOneOfTwenty()),然后返回(2)//这些是来自mockito的静态导入

部分模拟: 假设您有一个类,它为构造函数接受10个以上的参数(这不应该发生,但在本例中,让我们假设它会发生),创建整个对象是一件非常繁琐的事情。像mockito这样的框架允许您只使用您真正想要测试的对象部分。 比如说


@模拟大类大类//包含大量属性

when(big.getAttributeOneOfTwenty()),然后返回(2)//这些是来自mockito的静态导入

当我被迫使用依赖于抽象类继承的API和/或使用不可锁定静态类的遗留代码时(一个实际示例-DAO),我发现它很有用

部分模拟(从使用Mockito的Spy工具的意义上讲)允许您在第一种情况下模拟对继承方法的调用,或者将对强制使用的静态方法的调用包装到可以模拟、验证等的普通方法中

通常,您应该以这样一种方式设计和编写代码,这样您就不需要这种方式(依赖项注入、每个类的单一责任等)。但有时它是有用的

一个快速而粗略的示例,用于可视化静态API示例:

class BigUglyStaticLegacyApi {
   public static Foo someStaticMethodFetchingFoo() {...}
}

class Bar {

   public void someMethodYouTest() {
      Foo foo = getFoo();
      //do something with Foo (a FooBar, for example :) )
   }

   /*this one you mock via spying - not the most elegant solution,
     but it's better than nothing */
   @VisibleForTesting
   protected Foo getFoo() {
      return BigUglyStaticLegacyApi.someStaticMethodFetchingFoo(); 
   } 
} 

当我被迫使用依赖于抽象类继承的API和/或使用不可锁定的静态类的遗留代码(一个真实的示例-DAO)时,我发现它很有用

部分模拟(从使用Mockito的Spy工具的意义上讲)允许您在第一种情况下模拟对继承方法的调用,或者将对强制使用的静态方法的调用包装到可以模拟、验证等的普通方法中

通常,您应该以这样一种方式设计和编写代码,这样您就不需要这种方式(依赖项注入、每个类的单一责任等)。但有时它是有用的

一个快速而粗略的示例,用于可视化静态API示例:

class BigUglyStaticLegacyApi {
   public static Foo someStaticMethodFetchingFoo() {...}
}

class Bar {

   public void someMethodYouTest() {
      Foo foo = getFoo();
      //do something with Foo (a FooBar, for example :) )
   }

   /*this one you mock via spying - not the most elegant solution,
     but it's better than nothing */
   @VisibleForTesting
   protected Foo getFoo() {
      return BigUglyStaticLegacyApi.someStaticMethodFetchingFoo(); 
   } 
} 

我最常用它来模拟CUT(测试中的类)中的一些方法,但不是我实际进行单元测试的方法。这是Mockito单元测试中应该使用的一个重要特性。

我最常用它来模拟CUT(测试中的类)中的一些方法,但不是我实际进行单元测试的方法。这是Mockito单元测试中应该使用的一个重要特性