2014-04-15 82 views
2

我在我的基本抽象類和靜態getters/setters中使用靜態成員變量。這裏是我的階級結構:在抽象類中使用靜態變量

public abstract class Parent{ 
    private static XmlService xmlService; 
    //getters and setters for xmlService  
} 

這xmlService在子類用於XML轉換等等。然而,在運行時根據使用其他服務的數據創建的子類的實例。現在我想用junit進行測試,並且需要模擬xmlService。如果我不使它成爲靜態的,我沒有看到用mock初始化xmlService的任何方法。

所以我的問題是,這種方法(靜態+抽象)是好的,或者它打破了任何OOP概念等。我沒有看到這個問題,但只是想要一個意見。

感謝

編輯:我想根據意見,我會檢討我的設計,最有可能將與構造器注入的方式去

+0

可能是一個錯字,但這是一個無效的聲明語句。可能缺少變量的類型。 –

+1

你是否需要它是靜態的,或者只是爲了方便測試而使它變爲靜態的?如果除了測試之外,你不需要它是靜態的,那麼把它變成靜態的幾乎肯定是錯誤的。通常最好通過構造函數傳遞依賴關係。 –

+0

及其唯一的測試,這似乎對我來說可疑 – csn

回答

1

你的XML服務二傳手 - 只需設置一個模擬對象在你的@Before方法中:

public class ParentTest { 
    private Parent parent; 
    private XmlService origService; 

    @Before 
    public void setUp() { 
     parent = new Parent() { /* anonymously implement the abstract methods */ }; 
     origService = parent.getXmlService(); 
     XmlService moxkService = Mockito.mock(XmlService.class); 
     // record some behavior... 

     parent.setXmlService(mockService); 
    } 

    @After 
    public void tearDown() { 
     // Restore the original service 
     parent.setXmlService(origService); 
    } 

    // unit tests... 
} 
+0

這就是我已經在做什麼,我的問題不是如何嘲笑它,但它是否可以使用靜態變量只是爲了測試。 – csn