2016-09-26 115 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()并验证您是否拥有正确的数据。