我在我的项目中使用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进行单元测试的经验。
请帮忙。
答案 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()
并验证您是否拥有正确的数据。