【问题标题】:Mock findAll() method in ActiveJDBC for unit testing在 ActiveJDBC 中模拟 findAll() 方法进行单元测试
【发布时间】:2017-02-03 18:43:23
【问题描述】:

我在我的项目中使用 ActiveJDBC,它的模型为 ScriptRule。请查找附件代码sn-p。

    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&lt;T&gt; 对象。

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

请帮忙。

【问题讨论】:

    标签: java junit powermockito activejdbc


    【解决方案1】:

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

    相反,考虑这样的事情:

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

    还有一个像

    这样的愚蠢的 impl
    class RuleFinderImpl implements RuleFinder {
      @Override
      public List<ScriptRule> findAllRules() { return ScriptRule.findAll(); }
    }
    

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

    但是为了测试,你可以注入一个 mocked 对象。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 2013-11-12
        • 2018-11-21
        • 2018-10-19
        • 2013-07-24
        相关资源
        最近更新 更多