2017-09-26 4 views
0

J'ai un code spark qui envoie des requêtes à DynamoDB. Le AmazonDynamoDBClient qui est utilisé pour établir la connexion avec la base de données n'est pas sérialisable.Comment tester le code non sérialisable dans Spark

Je fais exemple de cette classe au sein de la méthode mapPartition à Scala comme celui-ci ->

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) 
    } 
} 

Le problème est que je veux tester ce code avec étincelle locale (-de base d'essai à l'étincelle) et DynamoDB en test unitaire.

Je ne peux pas prendre AmazonDynamoDBClient sur mapPartition depuis sa non sérialisable (exception est levée par étincelle)

Répondre

1

Vous pouvez créer un trait DynamoDBFactory qui est sérialisable, avec deux mises en œuvre, un « vrai » une fois et « test » un (je suppose que la question est de savoir comment « injecter » un client de test):

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 
    } 
} 

et puis, vous avez votre code testé attendre une instance de DynamoDBFactory et passer l'instance droit dans les tests/production code:

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

J'ai dû faire des modifications mineures, mais cela a fonctionné. Merci :) – cmbendre