2016-07-05 47 views
2

我的類結構如下:在模擬的Java的Mockito繼承的方法

public class MyParentClass { 

void doSomethingParent(){ 
    System.out.println("something in parent"); 
} 
} 

public class MyClass extends MyParentClass{ 


    protected String createDummyRequest(Holder myHolder){ 
     //... 
     super.doSomethingParent();//I want to avoid this 
     //... 
     callingDB(); 
     return "processedOutput"; 
    } 

    private void callingDB(){ 
     System.out.println("Calling to DB"); 
    } 
} 

然後我的單元測試:

public class UnitTest { 


    public void testCreateDummyRequest(){ 
     //create my mock holder 
     Holder mockHolder = new Holder(); 

     MyClass mockObj = Mockito.mock(MyClass.class); 
     //mock doSomethingParent() 
     //mock callingDB() 

     //as mockObj is a fully mock, but I need to run my real method 
     //Mockito.when(mockObj.createDummyRequest(mockHolder)).thenCallRealMethod(); 
     mockObj.createDummyRequest(mockHolder); 
     //Problem: doSomethingParent() is getting called though I have mocked it 
    } 
} 

如何防止)的super.doSomethingParent的調用(在我方法? (我正在寫測試的方法)

+0

我認爲Nicktar和Serghey Bishyr的答案可能已經對你有用了,但我可能會有更多評論。 可以肯定的是:你在UnitTest類中的目標是測試MyClass的實現,但打破MyParentClass的依賴性(換句話說,測試MyClass實現爲MyParentClass提供模擬)? –

回答

2

有了這個類結構嘲諷和測試真的很難。如果可能的話,我會建議改變結構,因爲在霧氣情況下,難以模擬和測試的班級結構同樣難以擴展和維護。

所以,如果你可以在你的類結構改變爲類似的東西:

public class MyClass { 

    private DoSomethingProvider doSomethingProvider; 

    private DbConnector dbConnector; 

    public MyClass (DoSomethingProvider p, DbConnector c) { 
     doSomethingProvicer = p; 
     dbConnector = c; 
    } 


    protected String createDummyRequest(Holder myHolder){ 
     //... 
     doSomethingProvider.doSomethingParent(); 
     //... 
     dbConnector.callingDB(); 
     return "processedOutput"; 
    } 
} 

然後,你可以方便地創建DoSomethingProvider和DbConnector瞧的嘲笑你的實例....

如果可以的話不改變你的類結構,你需要使用Mockito.spy而不是Mockito.mock來存根特定的方法調用,但使用真實的對象。

public void testCreateDummyRequest(){ 
    //create my mock holder 
    Holder mockHolder = new Holder(); 

    MyClass mockObj = Mockito.spy(new MyClass()); 

    Mockito.doNothing().when(mockObj).doSomething(); 

    mockObj.createDummyRequest(mockHolder); 
} 

注:使用super關鍵字防止從的Mockito該磕碰方法調用。我不知道是否有方法將呼叫存根超級。如果可能的話(就像你沒有重寫你的類中的父方法一樣),只要忽略關鍵字。

2

我面臨類似的問題,所以我發現使用spy()可以hepld。

public class UnitTest { 

    private MyClass myObj; 

    @Before 
    public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
    myObj= spy(new MyClass()); 
    } 

    @Test 
    public void mockedSuperClassMethod(){ 
    doNothing().when((MyParentClass)myObj).doSomethingParent(); 
    //... 
    } 
} 

這種方法適用於我。

+0

還要確保doSomethingParent()在超類中不是** final **,否則Mockito將無法嘲笑它。 –