2

我在我的项目中使用 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>对象。

因此,aPowerMockito.when(ScriptRule.findAll()).thenReturn();不起作用,因为我只能创建一个 utils 列表。有没有人有使用 ActiveJDBC 进行此类单元测试的经验。

请帮忙。

4

2 回答 2

2

您的问题只是您在那里编写了难以测试的代码。一种解决方法是使用Powermock。但是这样做无助于解决生产代码中的设计问题。

相反,考虑这样的事情:

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

和一个愚蠢的暗示

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

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

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

最后一次调用 new;您将使用factory,再次使用依赖注入。

这就是您编写可测试、良好解耦的生产代码的方式。与编写难以测试的生产代码并使用沉重的 Powermock 锤子来“修复”您的缺陷设计相比!

有关“编写可测试代码”的更多信息,请观看这​​些视频

于 2016-09-26T12:24:30.710 回答
0

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

于 2016-09-26T16:13:26.830 回答