我正在尝试单元测试doSomethingRdd
,这需要在rdd转换中从HBase读取一些参考数据。
def doSomethingRdd(in: DStream[String]): DStream[String] = {
in.map(i => {
val cell = HbaseUtil.getCell("myTable", "myRowKey", "myFamily", "myColumn")
i + cell.getOrElse("")
})
}
Object HBaseUtil {
def getCell(tableName: String, rowKey: String, columnFamily: String, column: String): Option[String] = {
val HBaseConn = ConnectionPool.getConnection()
//the rest of the code will use HBaseConn
//to get a HBase cell and convert to a string
}
}
我读了这篇Cloudera article,但我对他们推荐的方法有些疑问。
我尝试的第一件事是使用ScalaMock来模拟HBaseUtil.getUtil
方法,以便绕过HBase连接。我还做了一些解决方法,以模拟此article建议的对象单例。我更新了我的代码,如下所示。但是,doSomethingRdd
失败了,因为模拟的hbaseUtil不是序列化,Paul Butcher在他的reply
def doSomethingRdd(in: DStream[String], hbaseUtil: HBaseUtilBody:HBaseUtil): DStream[String] = {
in.map(i => {
val cell = HbaseUtil.getCell("myTable", "myRowKey", "myFamily", "myColumn")
i + cell.getOrElse("")
})
}
trait HBaseUtilBody {
def getCell(tableName: String, rowKey: String, columnFamily: String, column: String): Option[String] = {
val HBaseConn = ConnectionPool.getConnection()
//the rest of the code will use HBaseConn
//to get a HBase cell and convert to a string
}
}
object HBaseUtil extends HBaseUtilBody
我认为在RDD转换中从HBase获取数据将是一种非常常见的模式。但我不知道如何在不连接真正的HBase实例的情况下对其进行单元测试。
答案 0 :(得分:0)
在2020年,使用HBase 2.x,我们使用hbase-testing-util
。只需将其添加到您的SBT构建文件中
// https://mvnrepository.com/artifact/org.apache.hbase/hbase-testing-util
libraryDependencies + =“ org.apache.hbase”%“ hbase-testing-util”%“ 2.2.3”%测试
然后建立这样的连接
import org.apache.hadoop.hbase.HBaseTestingUtility
val utility = new HBaseTestingUtiliy
utility.startMiniCluster() // defaults to 1 master, 1 region server and 1 data node
val connection = utility.getConnection()
启动MiniCluster实际上会启动
如果您需要添加一些特定的配置(例如安全设置),则可以将hbase-site.xml添加到资源中。
有关更多信息,请参阅HBase Reference Guide中的使用HBase Mini-Cluster进行集成测试。