使用junit进行单元测试_使用JUnit5对DynamoDB应用程序进行单元测试
使用junit進行單元測試
在上一篇文章中,我描述了新的Java 2 AWS開發工具包,它為調用不同AWS服務的Java客戶端提供了非阻塞IO支持。 在本文中,我將介紹一種用于單元測試AWS DynamoDB調用的方法。
有幾種方法可以啟動DynamoDB的本地版本–
1. AWS提供了本地的DynamoDB
2. Localstack提供了一種在本地啟動大量AWS服務的方法
3. DynamoDB Local的Docker版本
4. Dynalite ,DynamoDB的基于節點的實現
現在可以對應用程序進行單元測試,我需要能夠在測試運行之前使用以下選項之一啟動DynamoDB的嵌入式版本,然后在測試完成后將其關閉。 我采用了三種方法:
1.使用JUnit 5擴展 ,該擴展在內部啟動AWS DynamoDB Local,并在測試后將其調低。
2.使用測試容器啟動Docker版本DynamoDB Local
3.使用測試容器啟動DynaLite
JUnit5擴展
JUnit5擴展提供了方便的掛鉤點來啟動
DynamoDB的嵌入式版本以進行測試。 它通過將DynamoDB Local版本作為Maven依賴項來工作:
這種依賴關系的一個復雜之處在于,存在與DynamoDB Local進行交互的本機組件(dll,.so等),并且為了將它們放置在正確的位置,我依賴于Gradle任務:
task copyNativeDeps(type: Copy) {mkdir "build/native-libs"from(configurations.testCompileClasspath) {include '*.dll'include '*.dylib'include '*.so'}into 'build/native-libs' }test {dependsOn copyNativeDeps }這會將本機庫放在build / native-libs文件夾中,并且擴展名在內部將此路徑設置為系統屬性:
System.setProperty("sqlite4java.library.path", libPath.toAbsolutePath().toString())這是JUnit5擴展的代碼庫,所有這些都已經連接起來-https://github.com/bijukunjummen/boot-with dynamodb / blob / master / src / test / kotlin / sample / dyn / rules / LocalDynamoExtension.kt
使用此擴展程序的測試如下所示:
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進行交互。
DynamoDB本地Docker的
該JUnit5擴展方法非常有效,但它需要與本地二進制一個額外的依賴在被拉到一個更簡潔的方法可以是使用好。 Testcontainers旋轉起來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()}...} }此代碼在一個隨機的未占用端口上啟動DynamoDB并提供此信息,以便可以使用此信息創建客戶端。 根據此處報告的問題,我不得不采取一些Kotlin解決方法。
使用Dynalite的
Dynalite是DynamoDB的基于javascript的實現,可以使用TestContainer方法再次運行以進行測試。 但是,這次已經有了Dynalite的TestContainer模塊 。 我發現它不支持JUnit5,并發送了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()}...} }結論
所有這些方法對于能夠測試與DynamoDB的集成都是有用的。 我個人的喜好是使用TestContainers方法,如果Docker代理在JUnit5擴展方法中可用的話。 在我的github存儲庫中提供了使用這三種方法進行了全面工作測試的示例– https://github.com/bijukunjummen/boot-with-dynamodb
翻譯自: https://www.javacodegeeks.com/2019/01/testing-dynamodb-using-junit5.html
使用junit進行單元測試
總結
以上是生活随笔為你收集整理的使用junit进行单元测试_使用JUnit5对DynamoDB应用程序进行单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: top域怎么使用()
- 下一篇: spring框架介绍_Spring框架介