我对使用Java的Mockito有疑问,我需要你的帮助: 我有一个A类,它有一个实现,B类有它的实现......在最后的C类中,我想模拟主类A.是否有可能? 平局将是这样的:
Class A ----> Class B ---> Class C
我想在C里面模拟A(很明显,A和B之间以及B和C之间存在继承)。 A和B以及C都是具有自己的实现类的DAO类。
我该怎么做?如何使用Mockito模拟A内部C实现类?
感谢您的支持和亲切的问候
答案 0 :(得分:1)
如果A
扩展B
并且您想测试A
模拟B
方法,则可以使用A
B
并模拟final A spy = Mockito.spy(yourInstanceOfA);
Mockito.doReturn(something).when(spy).methodOfB();
spy.methodOfA();
// add some assertions
方法:
{{1}}
答案 1 :(得分:0)
如果C只是层次结构中可扩展的最后一个类,而不是final
,则可以部分模拟C:
/**
* Tests C.foo(), which calls method bar() defined in A.
*/
@Test public void testFoo() {
// Spy on the system under test. This is unusal, but necessary here.
C c = Mockito.spy(new C());
// This ensures c.bar is never actually called, as opposed to Mockito.when().
Mockito.doReturn("quux").when(c).bar();
assertEquals("[quux]", c.foo());
}
如果C是final
,您可能需要将其作为整个单元进行测试,而不仅仅是通过B进行升级。
@RunWith(JUnit4.class) public class CTest extends BTest {
@Override protected B createB() {
return new C();
}
@Test public void testCSpecificBehavior() { /* ... */ }
}
如果您将来可以选择,可以考虑使用favoring composition over inheritance,因为它会为您提供更多测试选项。