4

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

谁能解释部分模拟与正常模拟有何不同?如果可能,请提供示例。

谢谢!

4

5 回答 5

4

部分模拟是你上课并要求它表现正常的地方,除非你想覆盖某些功能。这对于与应用程序的其他部分进行通信的单元测试服务很有用。通过覆盖将调用应用程序其他部分的行为,您可以单独测试您的服务。

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

于 2013-11-08T08:23:03.300 回答
1

来自EasyMock 2.2 类扩展文档

有时您可能只需要模拟类的某些方法并保持其他方法的正常行为。这通常发生在您想要测试调用同一类中其他一些方法的方法时。因此,您希望保持被测试方法的正常行为并模拟其他方法。

我有时会使用它来模拟(复杂或流程密集型)已经过全面测试的私有方法。

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

于 2013-11-08T08:30:09.087 回答
1

部分模拟:假设您有一个为构造函数接受 10 多个参数的类(这不应该发生,但对于这个示例来说,可以说它确实发生了)创建整个对象是一件真正的苦差事。像 mockito 这样的框架让你只使用你真正想要测试的对象的部分。例如

@Mock BigClass big; //contains loads of attributes

...

when(big.getAttributeOneOfTwenty()).thenReturn(2); //these are static imports from mockito

于 2013-11-08T08:56:08.100 回答
0

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

于 2013-11-09T11:59:37.777 回答
0

当我被迫使用依赖于抽象类继承的 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(); 
   } 
} 
于 2013-11-08T09:04:35.130 回答