日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用JUnit5对DynamoDB应用程序进行单元测试

發(fā)布時(shí)間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用JUnit5对DynamoDB应用程序进行单元测试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在之前的文章中,我描述了新的Java 2 AWS SDK,它為調(diào)用不同AWS服務(wù)的Java客戶端提供了非阻塞IO支持。 在本文中,我將介紹一種用于單元測試AWS DynamoDB調(diào)用的方法。

有幾種方法可以啟動(dòng)DynamoDB的本地版本–

1. AWS提供了一個(gè)DynamoDB本地

2. Localstack提供了一種在本地啟動(dòng)大量AWS服務(wù)的方法

3. DynamoDB Local的Docker版本

4. Dynalite ,DynamoDB的基于節(jié)點(diǎn)的實(shí)現(xiàn)

現(xiàn)在可以對應(yīng)用程序進(jìn)行單元測試,我需要能夠在測試運(yùn)行之前使用以下選項(xiàng)之一啟動(dòng)DynamoDB的嵌入式版本,然后在測試完成后將其關(guān)閉。 我采用了三種方法:

1.使用JUnit 5擴(kuò)展 ,該擴(kuò)展在內(nèi)部啟動(dòng)AWS DynamoDB Local,并在測試后將其調(diào)低。

2.使用測試容器啟動(dòng)Docker版本DynamoDB Local

3.使用測試容器啟動(dòng)DynaLite

JUnit5擴(kuò)展

JUnit5擴(kuò)展提供了方便的掛鉤點(diǎn)來啟動(dòng)
嵌入式版本的DynamoDB用于測試。 它通過將DynamoDB Local版本作為Maven依賴項(xiàng)來工作:

dependencies {...testImplementation("com.amazonaws:DynamoDBLocal:1.11.119")... }

這種依賴關(guān)系的一個(gè)復(fù)雜之處在于,存在與DynamoDB Local進(jìn)行交互的本機(jī)組件(dll,.so等),并且為了將它們放置在正確的位置,我依賴于Gradle任務(wù):

task copyNativeDeps(type: Copy) {mkdir "build/native-libs"from(configurations.testCompileClasspath) {include '*.dll'include '*.dylib'include '*.so'}into 'build/native-libs' }test {dependsOn copyNativeDeps }

它將本機(jī)庫放在build / native-libs文件夾中,擴(kuò)展名在內(nèi)部將此路徑設(shè)置為系統(tǒng)屬性:

System.setProperty("sqlite4java.library.path", libPath.toAbsolutePath().toString())

這是JUnit5擴(kuò)展的代碼庫,所有這些都已經(jīng)連接起來-https://github.com/bijukunjummen/boot-with dynamodb / blob / master / src / test / kotlin / sample / dyn / rules / LocalDynamoExtension.kt

使用此擴(kuò)展名的測試如下所示:

class HotelRepoTest {companion object {@RegisterExtension@JvmFieldval localDynamoExtension = LocalDynamoExtension()@BeforeAll@JvmStaticfun beforeAll() {val dbMigrator = DbMigrator(localDynamoExtension.syncClient!!)dbMigrator.migrate()}}@Testfun saveHotel() {val hotelRepo = DynamoHotelRepo(localDynamoExtension.asyncClient!!)val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip")val resp = hotelRepo.saveHotel(hotel)StepVerifier.create(resp).expectNext(hotel).expectComplete().verify()} }

該代碼可以與功能齊全的DynamoDB進(jìn)行交互。

DynamoDB本地Docker的

該JUnit5擴(kuò)展方法非常有效,但它需要與本地二進(jìn)制一個(gè)額外的依賴在被拉到一個(gè)更簡潔的方法可以是使用好。 Testcontainers旋轉(zhuǎn)起來DynamoDB本地下列方式的泊塢窗版本:

class HotelRepoLocalDynamoTestContainerTest {@Testfun saveHotel() {val hotelRepo = DynamoHotelRepo(getAsyncClient(dynamoDB))val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip")val resp = hotelRepo.saveHotel(hotel)StepVerifier.create(resp).expectNext(hotel).expectComplete().verify()}companion object {val dynamoDB: KGenericContainer = KGenericContainer("amazon/dynamodb-local:1.11.119").withExposedPorts(8000)@BeforeAll@JvmStaticfun beforeAll() {dynamoDB.start()}@AfterAll@JvmStaticfun afterAll() {dynamoDB.stop()}fun getAsyncClient(dynamoDB: KGenericContainer): DynamoDbAsyncClient {val endpointUri = "http://" + dynamoDB.getContainerIpAddress() + ":" +dynamoDB.getMappedPort(8000)val builder: DynamoDbAsyncClientBuilder = DynamoDbAsyncClient.builder().endpointOverride(URI.create(endpointUri)).region(Region.US_EAST_1).credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("acc", "sec")))return builder.build()}...} }

此代碼在一個(gè)隨機(jī)的未占用端口上啟動(dòng)DynamoDB并提供此信息,以便可以使用此信息創(chuàng)建客戶端。 根據(jù)此處報(bào)告的問題,我不得不采取一些Kotlin解決方法。

使用Dynalite的

Dynalite是DynamoDB的基于javascript的實(shí)現(xiàn),可以使用TestContainer方法再次運(yùn)行以進(jìn)行測試。 但是,這次已經(jīng)有了Dynalite的TestContainer模塊 。 我發(fā)現(xiàn)它不支持JUnit5,并發(fā)送了Pull請求來提供此支持,在迭代中可以使用原始docker鏡像,這就是測試的樣子:

class HotelRepoDynaliteTestContainerTest {@Testfun saveHotel() {val hotelRepo = DynamoHotelRepo(getAsyncClient(dynamoDB))val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip")val resp = hotelRepo.saveHotel(hotel)StepVerifier.create(resp).expectNext(hotel).expectComplete().verify()}companion object {val dynamoDB: KGenericContainer = KGenericContainer("quay.io/testcontainers/dynalite:v1.2.1-1").withExposedPorts(4567)@BeforeAll@JvmStaticfun beforeAll() {dynamoDB.start()val dbMigrator = DbMigrator(getSyncClient(dynamoDB))dbMigrator.migrate()}@AfterAll@JvmStaticfun afterAll() {dynamoDB.stop()}fun getAsyncClient(dynamoDB: KGenericContainer): DynamoDbAsyncClient {val endpointUri = "http://" + dynamoDB.getContainerIpAddress() + ":" +dynamoDB.getMappedPort(4567)val builder: DynamoDbAsyncClientBuilder = DynamoDbAsyncClient.builder().endpointOverride(URI.create(endpointUri)).region(Region.US_EAST_1).credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create("acc", "sec")))return builder.build()}...} }

結(jié)論

所有這些方法對于能夠測試與DynamoDB的集成都是有用的。 我個(gè)人的喜好是使用TestContainers方法,如果通過JUnit5擴(kuò)展方法可以使用其他Docker代理,則可以使用。 在我的github存儲(chǔ)庫中可以找到使用所有三種方法進(jìn)行了完全正常工作的測試的示例– https://github.com/bijukunjummen/boot-with-dynamodb

翻譯自: https://www.javacodegeeks.com/2019/01/testing-dynamodb-using-junit5.html

總結(jié)

以上是生活随笔為你收集整理的使用JUnit5对DynamoDB应用程序进行单元测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。