在之前的文章中,我描述了新的Java 2 AWS SDK,它为调用不同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依赖项来工作:

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

这种依赖关系的一个复杂之处在于,存在与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方法,如果通过JUnit5扩展方法可以使用其他Docker代理,则可以使用。 在我的github存储库中可以找到使用所有三种方法进行了完全正常工作的测试的示例– https://github.com/bijukunjummen/boot-with-dynamodb

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

使用JUnit5对DynamoDB应用程序进行单元测试相关推荐

  1. 使用junit进行单元测试_使用JUnit5对DynamoDB应用程序进行单元测试

    使用junit进行单元测试 在上一篇文章中,我描述了新的Java 2 AWS开发工具包,它为调用不同AWS服务的Java客户端提供了非阻塞IO支持. 在本文中,我将介绍一种用于单元测试AWS Dyna ...

  2. junit5_使用JUnit对ADF应用程序进行单元测试

    junit5 JUnit是Java语言的单元测试软件包,由于ADF构建在J2EE框架之上,因此可以用来测试Oracle ADF应用程序. 单元测试基本上是根据某些定义的测试标准来验证最小的可测试模块的 ...

  3. 使用xUnit为.net core程序进行单元测试(中)

    第一部分:  使用xUnit为.net core程序进行单元测试(上), 下面有一点点内容是重叠的.... String Assert 测试string是否相等: [Fact] public void ...

  4. 使用junit进行单元测试_使用JUnit对ADF应用程序进行单元测试

    使用junit进行单元测试 JUnit是Java语言的单元测试软件包,由于ADF构建在J2EE框架之上,因此可以用于测试Oracle ADF应用程序. 单元测试基本上是根据某些定义的测试标准来验证最小 ...

  5. 使用JUnit对ADF应用程序进行单元测试

    JUnit是Java语言的单元测试软件包,由于ADF构建在J2EE框架之上,因此可以用来测试Oracle ADF应用程序. 单元测试基本上是根据某些定义的测试标准来验证最小的可测试模块的过程. 在这里 ...

  6. Ubuntu 20.04系统中VSCode+CMake+GTest实现C++程序自动化单元测试的详细方法

    严正声明:本文系作者davidhopper原创,未经许可,不得转载. 一般地讲,软件测试分为四个阶段:单元测试.集成测试.系统测试.验收测试.单元测试一般指对软件中的最小可测试单元进行检查和验证.最小 ...

  7. 为Spark 程序添加单元测试

    为Spark 程序添加单元测试 一.ScalaTest 测试框架 二.Spark Application 该如何进行单元测试? 三.Spark Fast Tests 组件 相比于传统代码,Spark是 ...

  8. iOS开发 简述使用OCUnit对程序进行单元测试(UnitTest)

    2019独角兽企业重金招聘Python工程师标准>>> 所谓单元测试(又称为模块测试, Unit Testing)就是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作. ...

  9. dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)

    转:http://blog.csdn.net/yys79/article/details/66472797 最近,项目中频繁用到dubbo,而且java工程用引用了几十个关联系统的服务(如用户认证,基 ...

最新文章

  1. C#实现有向无环图(DAG)拓扑排序
  2. Android--Launcher拖拽事件详解【androidICS4.0--Launcher系列二】
  3. 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接
  4. 【动态规划】P1004 方格取数(四维dp模板题)
  5. apiclod 上传图片_apiCloud图片选择、处理、上传模块
  6. R︱Yandex的梯度提升CatBoost 算法(官方述:超越XGBoost/lightGBM/h2o)
  7. new与delete函数使用方法以及注意事项
  8. 软件项目开发文档模板
  9. css:电子数字显示
  10. 8位数码管静态显示c语言,数码管静态显示介绍_8位数码管静态显示程序解析
  11. 最小二乘法曲线拟合(c++实现)
  12. 贪心科技机器学习训练营(三)
  13. 哀悼日-全网变灰效果实现
  14. 关于pc浏览器浏览外网出现ERR_EMPTY_RESPONSE的问题
  15. matlab生成曲线程序,Matlab绘制频散曲线程序代码(20210119130722).docx
  16. MC34063+MOSFET扩流 12V-5V 折腾出了高效率电路(转)
  17. Google发展史 Google十三年
  18. 电脑相机出现0xA00F4289<ActiveCameraUnplugged>和0xA00F4244错误代码
  19. PLC模拟量输入 模拟量转换FB S_ITR(三菱FX3U)
  20. custom的短语_custom到底是什么意思?

热门文章

  1. Grakn Forces 2020——D题Pecco模型总结
  2. 洛谷P1373 小a和uim之大逃离 动态规划
  3. 二元运算 FFT+分治
  4. ElasticJob-分布式作业调度神器,你们还在用Quartz吗
  5. jsp中使用cookie时报错……
  6. 进入ASP .net mvc的世界
  7. 人脸认证源码faceIdentify
  8. mvc.net分页查询案例——实体层(HouseModel.cs)
  9. 用命令行执行java代码
  10. nginx,excel模板下载