Как я могу издеваться над доступом к DynamoDB через Spark в Scala? - PullRequest
0 голосов
/ 26 июня 2019

У меня есть работа Spark, написанная на Scala, которая в конечном итоге записывается в AWS DynamoDB.Я хочу написать несколько модульных тестов, но единственная проблема в том, что я понятия не имею, как можно насмехаться над битом, который записывает в DynamoDB.Я использую их emr-динамодб-коннектор класс, что означает, что я не использую никаких инъекций зависимостей (в противном случае это было бы легко).

После того, как я прочел в некотором СДРиспользуя данные Spark, я делаю несколько простых преобразований в них в пару RDD типа (org.apache.hadoop.io.Text, org.apache.hadoop.dynamodb.DynamoDBItemWritable).Так что мой код исправляет только «Динамо» путем создания DynamoDBItemWritable объектов.Этот класс по своей сути не содержит никакой логики для использования AWS SDK для сохранения чего-либо;по сути это просто объект данных.Затем мой код вызывает это:

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, но это звучит ужасно грязно, просто чтобы заставить работать модульный тест.К тому же я не уверен, что это возможно.

...