我目前正在使用jUnit与Mockito进行模拟,我偶然发现了 Partial Mocking 部分,您可以使用Mockito.spy来部分模拟该对象。我似乎不理解部分模拟这个概念,因为我找不到一个我应该使用它的场景(因为它与一般的模拟非常相似)。
有人可以解释部分模拟与正常模拟的区别吗?如果可能的话,请提供示例。
谢谢!
答案 0 :(得分:2)
部分模拟是您接受课程并要求其表现正常的地方,除非您想要覆盖某些功能。 这对于与应用程序的其他部分进行通信的单元测试服务非常有用。通过覆盖调用应用程序其他部分的行为,您可以单独测试服务。
另一个例子是组件与数据库驱动程序通信。通过模拟与驱动程序通信的部分,您可以测试该部分应用程序而无需拥有数据库。
答案 1 :(得分:1)
来自EasyMock 2.2 classextension documentation:
有时您可能只需要模拟某个类的某些方法并保留 他人的正常行为。这通常发生在你想要的时候 测试一个在同一个类中调用其他人的方法。所以你想要 保持测试方法的正常行为并嘲笑其他方法。
我有时会使用它来模拟(复杂或过程密集)已经完全测试的私有方法。
部分嘲弄可能非常方便,但我尽量避免使用它。
答案 2 :(得分:1)
部分嘲笑: 假设你有一个类,它为构造函数提供10个以上的参数(这不应该发生,但是对于这个例子,我们可以说它确实如此)创建整个对象是一项真正的苦差事。像mockito这样的框架让你只使用你想要测试的对象部分。 例如
@Mock BigClass big; //contains loads of attributes
...
when(big.getAttributeOneOfTwenty()).thenReturn(2); //these are static imports from mockito
答案 3 :(得分: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();
}
}
答案 4 :(得分:0)
我最常用它来模拟我的CUT(Class Under Test)中的一些方法,但不是我实际上是单元测试的方法。这是一个重要的功能,应该用于Mockito的单元测试。