【发布时间】:2019-11-07 22:47:06
【问题描述】:
我有一个用 Scala 编写的 Spark 作业,最终写入 AWS DynamoDB。我想围绕它编写一些单元测试,但唯一的问题是我不知道如何去模拟写入 DynamoDB 的位。我正在使用他们的emr-dynamodb-connector 类,这意味着我没有使用任何依赖注入(否则这很容易)。
在我使用 Spark 读入一些 RDD 数据后,我对其进行了一些简单的转换,将其转换为 (org.apache.hadoop.io.Text, org.apache.hadoop.dynamodb.DynamoDBItemWritable) 类型的 Pair RDD。所以我的代码对 Dynamo 的唯一改进是创建 DynamoDBItemWritable 对象。该类本身不包含任何利用 AWS 开发工具包保存任何内容的逻辑;它本质上只是一个数据对象。然后我的代码调用这个:
val conf = new Configuration()
conf.set("dynamodb.servicename", "dynamodb")
conf.set("dynamodb.input.tableName", "MyOutputTable")
conf.set("dynamodb.output.tableName", "MyInputTable")
conf.set("dynamodb.endpoint", "https://dynamodb.us-east-1.amazonaws.com")
conf.set("dynamodb.regionid", "us-east-1")
conf.set("mapred.output.format.class", "org.apache.hadoop.dynamodb.write.DynamoDBOutputFormat")
conf.set("mapred.input.format.class", "org.apache.hadoop.dynamodb.read.DynamoDBInputFormat")
myTransformedRdd.saveAsHadoopDataset(new JobConf(conf)
...连接器会神奇地注册正确的类并进行正确的调用,从而有效地将结果相应地保存到 DynamoDB。
我不能模拟SparkSession,因为它有一个私有构造函数(无论如何这会非常混乱)。据我所知,我没有任何直接的方法来模拟 DynamoDB 客户端。 Scala(或 Scalatest,或 Scalamock)中是否有一些神奇的语法可以让我告诉它,如果它想要实例化 Dynamo 客户端类,它应该使用模拟版本?
如果没有,我将如何测试这段代码?我想从理论上讲,也许有一种方法可以设置 Dynamo 的本地内存实例,然后更改 dynamodb.endpoint 的值,但这听起来非常混乱,只是为了让单元测试正常工作。另外,我不确定这是否可能。
【问题讨论】:
-
Local in-memory instance 可用。正如你所说,这是一个相当混乱的方法。我在项目中使用过它,即使使用相当简单的数据模型,文本固定装置也会变得相当复杂且容易出错。
标签: scala apache-spark amazon-dynamodb scalatest scalamock