Java 用于单元测试的ActiveJDBC中的Mock findAll()方法
我在我的项目中使用ActiveJDBC,它有一个模型Java 用于单元测试的ActiveJDBC中的Mock findAll()方法,java,junit,powermockito,activejdbc,Java,Junit,Powermockito,Activejdbc,我在我的项目中使用ActiveJDBC,它有一个模型ScriptRule。请查找所附的代码段 public class RuleEvaluatorProvider { public static RuleEvaluatorClient getRuleEvaluatorClient() throws ScriptException, IOException { List<ScriptRule> scriptRuleList = ScriptRule.findAll()
ScriptRule
。请查找所附的代码段
public class RuleEvaluatorProvider {
public static RuleEvaluatorClient getRuleEvaluatorClient() throws ScriptException, IOException {
List<ScriptRule> scriptRuleList = ScriptRule.findAll();
// some processing
return new RuleEvaluatorClient(someObj);
}
}
公共类RuleEvaluatorProvider{
公共静态RuleEvaluatorClient getRuleEvaluatorClient()引发ScriptException,IOException{
List scriptRuleList=ScriptRule.findAll();
//一些加工
返回新的RuleEvaluatorClient(someObj);
}
}
我正在使用PowerMock编写单元测试。我在测试方法RuleEvaluatorProvider.getRuleEvaluatorClient()
时遇到了一个问题。findAll()
方法返回一个org.javalite.activejdbc.LazyList
对象
因此,aPowerMockito.when(ScriptRule.findAll()).thenReturn()代码>不起作用,因为我只能创建一个utils列表。有没有人有使用ActiveJDBC进行类似单元测试的经验
请帮助。您的问题很简单,您在那里编写了难以测试的代码。解决此问题的一种方法是使用Powermock。但这样做无助于解决生产代码中的设计问题
请考虑这样的事情:
interface RuleFinder {
public List<ScriptRule> findAllRules();
}
接口规则查找器{
公共列表findAllRules();
}
和一个愚蠢的impl一样
class RuleFinderImpl implements RuleFinder {
@Override
public List<ScriptRule> findAllRules() { return ScriptRule.findAll(); }
}
类RuleFinderImpl实现RuleFinder{
@凌驾
公共列表findAllRules(){return ScriptRule.findAll();}
}
现在,您可以使用依赖项注入提供一些对象,将RuleFinder接口实现到生产代码中。
关键是:在运行时,该对象只是impl类的一个实例,它在ScriptRule中调用该静态方法
但是对于测试,您可以注入一个模拟的对象
并为最后的呼吁,以新的;您将使用工厂,同样使用依赖项注入
这就是您编写可测试、良好解耦的生产代码的方式。与编写难以测试的生产代码和使用重型Powermock锤子“修复”您的缺陷设计相比
有关“编写可测试代码”的更多信息,请观看。我认为您不需要编写此代码。换句话说,您是在模仿ActiveJDBC模型中的一些东西。编写访问本地测试数据库并写入/返回测试记录的测试要好得多。换句话说,我建议在本地数据库中输入一些测试记录,然后调用findAll()
,验证您是否拥有正确的数据