使用Mockito模拟子类中的父类

时间:2014-03-13 09:47:59

标签: java unit-testing inheritance mockito

我对使用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实现类?

感谢您的支持和亲切的问候

2 个答案:

答案 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,因为它会为您提供更多测试选项。