Java 用于单元测试的ActiveJDBC中的Mock findAll()方法

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()

我在我的项目中使用ActiveJDBC,它有一个模型
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
对象

因此,a
PowerMockito.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()
,验证您是否拥有正确的数据