2017-09-26 26 views
0

私はDynamoDBにリクエストを送信するスパークコードを持っています。データベースとの接続に使用されるAmazonDynamoDBClientはシリアル化できません。 Sparkでシリアル化可能でないコードをテストする方法

だから私はこのようなScalaで mapPartitionメソッド内で、このクラスのインスタンスを作ってるんだ - >

recordsToWrite.mapPartitions { iter => 
    var credentials = new BasicAWSCredentials(awsAccess, awsSecret) 
    var client= new AmazonDynamoDBClient(credentials) 
    var dynamoDB=new DynamoDB(client) 
    var optTable=dynamoDB.getTable(tableName) 
    iter.map { x => 
    //some code.... 
    optTable.updateItem(x) 
    } 
} 

問題は、私は地元のスパーク(火花テストベース)とDynamoDBので、このコードをテストしたいです単位テスト。

私は(例外が火花によってスローされます)

答えて

1

あなたは、2つの実装で、「本当の」1とはシリアライズあるDynamoDBFactory形質を作成することができ、その直列化可能ではないので、mapPartitionのうち、AmazonDynamoDBClientを取ることができません「テスト」1(私は問題がテストクライアントを「注入」する方法であると仮定しています):

trait DynamoDBFactory extends Serializable { 
    def createClient(awsAccess: String, awsSecret: String): DynamoDB 
} 

class RealDynamoDBFactory extends DynamoDBFactory { 
    def createClient(awsAccess: String, awsSecret: String): DynamoDB = { 
    var credentials = new BasicAWSCredentials(awsAccess, awsSecret) 
    var client= new AmazonDynamoDBClient(credentials) 
    new DynamoDB(client) 
    } 
} 

class TestDynamoDBFactory extends DynamoDBFactory { 
    def createClient(awsAccess: String, awsSecret: String): DynamoDB = { 
    // return your test stub/mock/whatever you need 
    } 
} 

そして、あなたのテストコードを持っているがDynamoDBFactoryのインスタンスを期待してテスト/本番で右のインスタンスを渡しますコード:

val dynamoDBFactory: DynamoDBFactory = // ...get it from caller 
recordsToWrite.mapPartitions { iter => 
    var dynamoDB = dynamoDBFactory.createClient(awsAccess, awsSecret) 
    var optTable=dynamoDB.getTable(tableName) 
    iter.map { x => 
    //some code.... 
    optTable.updateItem(x) 
    } 
} 
+0

マイナーな変更は必要でしたが、機能しました。ありがとう:) – cmbendre

関連する問題