在ActiveJDBC中模拟findAll()方法进行单元测试

时间:2016-09-26 12:15:23

标签: java junit powermockito activejdbc

我在我的项目中使用ActiveJDBC,模型ScriptRule。请找到附带的代码段。

    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 个答案:

答案 0 :(得分:2)

您的问题很简单,就是您已经编写了难以测试的代码。一种解决方法是使用 Powermock 。但这样做无助于生产代码中的设计问题。

相反,请考虑这样的事情:

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

和愚蠢的impl一样

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

现在,您可以使用依赖项注入为生产代码提供一些实现 RuleFinder 接口的对象。 关键在于:在运行时,该对象只是该impl类的一个实例,它在 ScriptRule 中调用 static 方法。

但是对于测试,您可以注入模拟对象。

最后打电话给新人;您将使用工厂,再次使用依赖注入。

这就是你编写可测试的,分离良好的生产代码的方法。与编写难以测试的生产代码并使用重型Powermock锤子来“修复”您的不足设计!

有关“编写可测试代码”的更多信息,请观看videos

答案 1 :(得分:0)

我认为你不需要编写这段代码。换句话说,你正在嘲笑ActiveJDBC模型产生的东西。编写访问本地测试数据库和写入/返回测试记录的测试要好得多。换句话说,我建议在本地数据库中输入一些测试记录,然后调用findAll()并验证您是否拥有正确的数据。