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

在之前的文章中,我描述了新的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤题库】陕西师范大学202421 教育管理心理学 作业 (专升本)

《教育管理心理学》作业 一、名词解释 人际知觉 2.态度 3.内化 4.社会知觉角色知觉 6.晕轮效应 7.激励因素 8.经济人退化 10.首因效应 11.激励 12.需要 13.保健因素 14. 挫折 15.制…

centos 安装php扩展gd,linux(centos)下为php添加添加GD扩展

yum -y install libjpeglibjpeg-devel libpng libpng-devel freetype freetype-devel 安装依赖库yum -y install libjpeg-devel1.首先切换到php源码目录:/usr/local/php-5.6.29/ext/gd2.利用phpize生成gd扩展文件,/usr/local/php/bin/mipsel-linux-phpize, ls 或者 …

【渝粤题库】陕西师范大学209013 计量经济学 作业

一、名词解释 1.偏回归系数 2.异方差性 3.虚拟变量 4.间接最小二乘法 5.调整的多元可决系数 6.序列相关性 7.滞后变量 8.行为方程 9.受约束回归 10.多重共线…

【渝粤题库】陕西师范大学210023 学前儿童社会教育 作业(专升本)

《学前儿童社会教育》作业 一、单选题 1.我国有关儿童社会性发展研究得到迅速发展的年代是( ) A.20世纪30年代 B.20世纪70年代 C.20世纪80年代 D..20世纪90年代 2.安斯沃思将婴幼儿的…

php numeric乘法,PHP is_numeric()用法及代码示例

is_numeric()函数是PHP中的内置函数,用于检查传入函数中作为参数的变量是数字还是数字字符串。该函数返回一个布尔值。用法:bool is_numeric ( $var )参数:该函数接受一个必须的单个参数,如下所述:$var:此输入参数是变量&#xff…

【渝粤题库】陕西师范大学292161社会保障概论 作业(专升本)

《社会保障概论》作业 一、填空题 1、英国政府于1601年颁布了 ,标志着社会保障制度的萌芽。 2、 是社会保障制度的核心部分, 是社会保障的最高层次; 是社会保障最后一道防线。 3、就业保障制度包括: 、 、 三方面内容。 4、工伤保…

jooq权限配置_将jOOQ与Spring结合使用:配置

jooq权限配置我遇到了由ORM引起的性能问题。 尽管我不得不承认大多数这些问题确实是由您造成的,但是我开始认为在只读操作中使用ORM是不值得的。 我开始寻找实现这些操作的替代方法。 这就是我遇到jOOQ的方式 ,它指出: jOOQ从您的数据库生…

【渝粤题库】陕西师范大学600001物理化学(上) 作业(专升本)

《物理化学(上)》作业 一.单选题 1.下列物理量中属于强度性质的是 A. H B. S C. p D. G 2.298.2K时,1mol的氧气(可视为理想气体)经等温可逆膨胀后,体积胀大10倍,对于该过程来说, 其Δ…

employee.java,Java基础系列(六):对象与类(上)

概述类(class)是构造对象的模板。由类构造对象的过程称为创建类的实例。封装从形式上看,封装是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域,而操纵数据的过程称之为方法。对于每个特定的类实例…

【渝粤题库】陕西师范大学800007 地理信息系统

《地理信息系统》作业 一.名词解释 1.TIN       2 .缓冲区分析 3.元数据 4. 地理信息系统 5.空间数据库  6.拓扑关系 7.矢量结…

国家开放大学2021春1080工程数学(本)题目

教育 教育 试卷代号: 1080 2021年春季学期期末统一考试 工程数学(本) 试题 2021年7月 一、单项选择题(每小题3分,共15分) 1.设方阵可逆,则下列命题中不正确的是( ). A. B.线性方程组必有非零解…

弹簧启动执行器教程

朋友您好,在本教程中,我们将学习弹簧执行器及其所有功能。 1.什么是弹簧执行器? 2.如何在Maven项目或Gradle项目中添加弹簧执行器? 3.创建一个具有Spring Actuator依赖项的Spring Boot项目。 4.使用弹簧执行器端点监视应用程序…

matlab 大于并且小于,Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列

更新:我做了一些测试,Jonas的解决方案对于一系列不同大小的输入向量来说是最快的.特别是,正如angainor指出的那样,解决方案可以很好地扩展到大尺寸 – 这是一个重要的测试,因为通常是大尺寸的问题促使我们在SO上提出这些问题.感谢Jonas和tmpearce的解决方案 – 基于…

matlab 里try用法,matlab在整个程序(全局)中使用try-catch来报告错误

我的matlab程序是一个多窗口程序化GUI。我已经实现了一个报告系统,所以当遇到错误时,它会调用我编写的函数generateReport.m,它发送一个带有一些日志和状态信息的电子邮件,然后继续执行。为了实现这一点,我在每个单独的…

【渝粤题库】陕西师范大学200741概率论与数理统计作业(高起本、专升本)

《概率论与数理统计》作业 一、填空题 1.设有两门高射炮,每一门击中飞机的概率都是0.6,则同时发射一发炮弹而击中飞机的概率为   .若有一架敌机入侵领空,欲以99%以上的概率及中它,至少需 __&…

php xls 邮件,PHPMailer发送邮件

PHPMailer是一个封装好的PHP邮件发送类,支持发送HTML内容的电子邮件,以及图片附件,前提要设置好邮件服务器就能实现邮件发送功能。HTML首先我们先放置一个收件箱的输入框和一个发送邮件按钮:收件人:jQuery$(function()…

activiti自定义_在Activiti中执行自定义查询

activiti自定义(这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想要共享它了) Activiti API允许使用高级API与数据库进行交互。 例如,对于检索数据,查询API和本机查询API的用法很强大。 但是&#xff0…

【渝粤题库】陕西师范大学201371 国际法学作业

《国际法》作业 一、填空题 1.( )和( ) 是国际法的主要渊源。 2.现代国际法主体应包括:国家、( )和( ) 3.国家领土包括:领…

【渝粤题库】陕西师范大学201901 中国古代文学(二) 作业(高起专)

《中国古代文学(二)》【高起专】作业 一、单选题 1、提出“大凡物不得其平则鸣”这一著名观点的作家是( ) A 李白 B 杜甫 C 韩愈 D 白居易 2、韦庄写有一首涉及黄巢起义的长篇叙事诗,题目叫做( &#xff09…

php实际开发过程,4.工作实际开发应用

**本文以thinkphp5中扩展 think-queue的应用为实例**1.安装think-queue 扩展composer install topthink/think-queue2.index模块下新建控制器,调用消息队列入队~~~namespace app\index\controller;/*** 文件路径: \application\index\controller\JobTest.php* 该控制…