Scala / Spark中的静态方法和构造函数拦截模拟

时间:2016-08-14 13:40:17

标签: scala apache-spark mocking powermock

全部,这是一个问题,我的搜索几乎没有深入了解。我认为这应该是我们所有人针对大数据框架开发而且寻求100%测试覆盖率的相当普遍的问题。所以我会在这里发布这个问题,试图收集最好的社区回应&想法。

考虑我们需要模拟实例化外部API对象的类

的场景
class SolrClientWrapper {
   def doWork() = {
       val cli = new CloudSolrClient("zkHost1")
       ???
   }
}

为了获得100%的测试覆盖率,并且在单元测试期间没有实际依赖Solr服务器,我们将有一种方法来拦截对new CloudSolrClient的调用。据我所知,唯一可用的库是PowerMock

这是The Twist PowerMock和其他Mock库需要asm作为依赖项,但复杂的框架Spark项目也需要asm。存在版本冲突,因此(测试 - )运行时地狱。

针对这种情况,最好的设计重构/库是什么?

1 个答案:

答案 0 :(得分:1)

不应在CloudSolrClient类中创建新的SolrClientWrapper对象,而应将其作为依赖项传递。然后在测试中,您可以传递模拟而不是真实对象。请注意,有许多依赖注入框架和机制可以使您更容易管理依赖项(例如,自动实例化它们并为您传递给构造函数)。

不确定asm是什么,但是一旦删除了在类体内实例化内容的部分代码(因此需要“拦截”任何东西),你发布的代码应该很容易测试而没有这种依赖性