gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:32:58 28 4
gpt4 key购买 nike

我在我的项目中使用 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();不会工作,因为我只能创建一个实用程序列表。有没有人有使用 ActiveJDBC 进行此类单元测试的经验。

请帮忙。

最佳答案

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

相反,考虑这样的事情:

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

还有一个愚蠢的暗示

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

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

但为了测试,您可以注入(inject)一个mocked 对象。

最后调用 new;您将再次使用依赖注入(inject)的工厂

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

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

关于java - 在 ActiveJDBC 中模拟 findAll() 方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39702548/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com