2014-03-13 95 views
0

我有一個關於Mockito和Java的問題,我需要你的幫助: 我有一個類A,它有一個實現和一個B類的實現......並且在最終課堂CI想嘲笑主要類A.是否有可能? 拉伸會是這樣:用Mockito模擬子類中的父類

Class A ----> Class B ---> Class C 

,我想嘲笑A內C(obiously有A和B之間的繼承,以及B和C之間)。 A和B和C都是具有其自己的實現類的DAO類。

我該怎麼做?我怎樣才能用Mockito來模擬C實現類的內部?

感謝您的支持和親切的問候

回答

1

如果A延伸B和你想測試A嘲諷B方法,你可以使用的A和模擬B方法spy

final A spy = Mockito.spy(yourInstanceOfA); 
Mockito.doReturn(something).when(spy).methodOfB(); 

spy.methodOfA(); 
// add some assertions 
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,因爲它爲您提供了更多的測試選項。