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