2016-09-26 58 views
1

我在我的項目中使用了ActiveJDBC,它有一個型號爲ScriptRule的項目。請查找附件中的代碼片段。在ActiveJDBC中模擬findAll()方法進行單元測試

public class RuleEvaluatorProvider { 

public static RuleEvaluatorClient getRuleEvaluatorClient() throws ScriptException, IOException { 
    List<ScriptRule> scriptRuleList = ScriptRule.findAll(); 
    // some processing 
    return new RuleEvaluatorClient(someObj); 
} 
} 

我正在使用PowerMock編寫單元測試。我在測試方法RuleEvaluatorProvider.getRuleEvaluatorClient()時遇到問題。 findAll()方法返回一個org.javalite.activejdbc.LazyList<T>對象。

因此,PowerMockito.when(ScriptRule.findAll()).thenReturn();不起作用,因爲我只能創建一個utils List。有沒有人有使用ActiveJDBC進行單元測試的經驗。

請幫忙。

回答

2

你的問題很簡單,就是你在那裏編寫了難以測試的代碼。一種解決方法是使用Powermock。但是這樣做不會有助於解決生產代碼中的設計問題。

相反,考慮這樣的事情:

interface RuleFinder { 
    public List<ScriptRule> findAllRules(); 
} 

和愚蠢IMPL像

class RuleFinderImpl implements RuleFinder { 
    @Override 
    public List<ScriptRule> findAllRules() { return ScriptRule.findAll(); } 
} 

現在你可以使用依賴注入提供一些對象實現該RuleFinder接口到您的生產代碼。 那裏的關鍵是:在運行時,該對象只是該impl類的一個實例,它調用靜態方法ScriptRule

但是對於測試,您可以注入一個嘲笑對象。

並最終打電話給新的;你會使用工廠,再次依賴注入。

這就是你如何編寫可測試的,良好解耦的生產代碼。與編寫難以測試的生產代碼和使用重型Powermock錘來「修復」您的不足設計!

想了解更多關於「編寫可測試代碼」的信息,請看那些videos

0

我不認爲你需要寫這段代碼。換句話說,你在嘲笑來自ActiveJDBC模型的東西。編寫訪問本地測試數據庫並寫入/返回測試記錄的測試會更好。換句話說,我會建議在本地數據庫中輸入一些測試記錄,然後調用findAll()並驗證您是否擁有正確的數據。