2016-12-07 66 views
0

我只想寫這段代碼單元測試:我應該如何測試超級(xy)呼叫?

public class MyClass extends SomeClassICanNotChange { 

    public MyClass(SomeObjectThatTheSuperClassNeed param) { 
     super(param); 
    } 

    @Override 
    protected boolean thisMethodIWantToTest() { 
     return true; // Some magic here 
    } 

一些限制:

  • 我不能改變超SomeClassICanNotChange
  • 有必要呼籲super(param)
  • 的超SomeClassICanNotChange做一些東西與param,所以才Mockito.mock(SomeObjectThatTheSuperClassNeed.class)將無法​​正常工作(NPE)。

我想測試方法thisMethodIWantToTest()。我唯一的想法是嘲笑超類需要的所有方法。有點像這樣:Mockito.when(myMock.xy()).thenReturn(..)。但這似乎不是很聰明。

有沒有人知道更好的方式來寫這個UnitTest?

非常感謝您

+0

如果你想測試超類,你總是可以創建一個完整的單獨的測試套件僅用於測試該類,與您在派生類中擴展它的任何代碼分開。通常只爲與您集成的第三方庫編寫測試,並且還可以幫助您確認對該代碼的使用情況。 –

+0

感謝您的快速回復。我不想測試超類。在我的單元測試中,我只想測試'thisMethodIWantToTest()'方法。 但感謝提示測試第三方庫。 – user6479676

回答

0

如果thisMethodIWantToTest)(不需要SomeObjectThatTheSuperClassNeed服務宗旨,你可以,甚至應該從MyClass分離到一個單獨的類型。 - >如果一個類型需要另一個類型來創建它,但不需要它來達到它的目的,那麼這是一個糟糕的設計。

如果thisMethodIWantToTest需要SomeObjectThatTheSuperClassNeed,那麼它一方面是一個不愉快的設計,因爲它將抽象和實現混合在一起,這使得事情變得太複雜。另一方面,你可以通過實際的實現並對其進行測試(不是那麼好),也可以模擬SomeObjectThatTheSuperClassNeed併爲其他測試用例提供模擬。

但無論如何,如果很難測試某些東西,這是一個設計缺陷的標誌。你要麼現在改變它,我認爲你不能,或者,我最好的猜測是你去解耦到單獨的類型...

+0

謝謝你的提示。 – user6479676

+0

你應該正確地格式化你的答案。 –