2013-05-03 38 views
0

我是新來的單元測試和的Mockito,但我需要測試這個類:測試的Mockito方法無效,重寫成員變量

public class XMLHandler { 
    private static final String CONFIG_FILE = "path/to/xml"; 
    private XMLConfiguration config = null; 

    public XMLHandler() { 
     try { 
      config = new XMLConfiguration(CONFIG_FILE); 
      config.setValidating(true); 
     } catch (ConfigurationException e) { 
      LOGGER.log(Level.SEVERE, e); 
     } 
    } 

    public List<ConfigENtries> getEntries() {  
     // do some stuff 
     return list; 
    } 

    @Override 
    public void removeEntry(int index) { 
     // remove entry 
    } 
} 

我想我有一個實體模型,但我重寫配置變量沒有二傳手,那我該怎麼做? 那麼removeEntry呢?如何測試無效方法?

我希望有人能幫助我這個

+0

可能的重複[http://stackoverflow.com/questions/15406769/how-to-mock-objects-that-are-not-passed-as-arguments](http://stackoverflow.com/questions/15406769/如何將模擬對象作爲參數傳遞給對象) – 2013-05-03 08:33:57

+0

您是否有權修改類? – 2013-05-03 08:43:27

+0

使用私有構造函數時,您將無法在另一個類中測試此功能。 – 2013-05-03 08:55:40

回答

1

當你被允許修改您的課,我建議以下結構:

public class XMLHandler { 
    private final XMLConfiguration config; 

    public XMLHandler(XMLConfiguration config) { 
    this.config = config; 
    } 

    public List<ConfigENtries> getEntries() {  
    // do some stuff 
    return list; 
    } 

    @Override 
    public void removeEntry(int index) { 
    // remove entry 
    } 
} 

確保XMLConfiguration接口,不一個具體的實現。然後你可以模擬傳遞給你的構造函數的config參數。 (注:您可以模擬非最終具體類也一樣,但使用的接口將是首選

然後,您可以測試XMLHandler公共方法和通過檢查來config並聲稱取得了電話確認正確的行爲該方法的迴應是正確的。

無效方法可以毫無問題地進行測試。你只需要一些方法來確定你的對象和世界的狀態已經被調整了。因此,也許您需要在測試結束時調用getter方法,以確保值已更改。或者驗證預期的呼叫是否發送給您的模擬對象。

+0

Mockito可以模擬具體的類,只要它們不是最終的,所以XMLConfiguration不一定是一個接口,但我認爲這是一個很好的習慣。 – 2013-05-03 09:15:39

+0

@ChrisKnight是的,好點。我應該說清楚。我已經編輯過。 – 2013-05-03 09:16:25

0

雖然我也寧願修改構造,並通過XMLConfiguration中像@DuncanJones暗示(或者使用一些其他類型的依賴注入),可以使用通過的Mockito在測試中使用@InjectMocks註釋嘲笑XMLConfiguration

@RunWith(MockitoJUnitRunner.class) 
public class XMLHandlerTest { 

    @InjectMocks 
    XMLHandler handler = new XMLHandler(); 

    @Mock 
    XMLConfiguration config; 

    //...