使用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依赖项来工作:

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方法,如果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应用程序进行单元测试相关推荐

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

    在之前的文章中,我描述了新的Java 2 AWS SDK,它为调用不同AWS服务的Java客户端提供了非阻塞IO支持. 在本文中,我将介绍一种用于单元测试AWS DynamoDB调用的方法. 有几种方 ...

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

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

  3. junit进行单元测试_通过JUnit规则轻松进行AppEngine单元测试

    junit进行单元测试 by Ramesh Lingappa 通过拉梅什·林加帕(Ramesh Lingappa) 通过JUnit规则轻松进行AppEngine单元测试 (AppEngine unit ...

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

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

  5. 单元测试实践思考(junit5+jmockit+testcontainer)

    文章目录 背景 方案设计 单元测试指导思想 单层隔离 内部穿透 技术实现 依赖管理 基础架构 封装Junit5&Jmockit 单元测试配置 TestContainer封装 官方方案 实际方案 ...

  6. mockito 单元测试_使用FizzBu​​zz和Mockito进行单元测试

    mockito 单元测试 我有时使用FizzBu​​zz向新手演示单元测试的基础. 尽管FizzBu​​zz确实是一个简单的问题,但它也可以用于演示更高级的单元测试技术,例如模拟 . FizzBu​​ ...

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

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

  8. 可以进行单元测试么_大量实例助攻,让你的单元测试更高效

    关注[搜狐技术产品]公众号,第一时间获取技术干货 导读 单元测试作为程序员的必修课,对代码的稳定性起着关键性的作用,但是你真的会写单元测试么?什么才算是真正的单元测试?这些疑问你都将在文章中得到解答. ...

  9. ju 单元测试_使用 JUnit4 编写单元测试

    主要内容: 从 What, Why, When, How, Deep 几个方面来介绍单元测试相关的基础知识. 需要技能: 了解 Java 编程语言,能够使用 IDEA 等. What 单元测试(uni ...

最新文章

  1. Dubbo(七)之自动加载环境变量
  2. java设计模式迭代器模式_迭代器设计模式示例
  3. 云适配签约比亚迪 构建统一工作平台
  4. 在vue项目中同时使用element-ui和mint-ui,的时候,.babelrc配置文件怎么写
  5. php observer,php设计模式 Observer (观察者模式)
  6. 鸿蒙开放远程测试,跟阿斌一起学鸿蒙(3). 远程虚拟设备的限制和使用方法
  7. TF-IDF算法介绍及实现
  8. 渥太华大学计算机专业,加拿大渥太华大学计算机科学排名第四
  9. 英语的形容词变为of加名词形式的具体用法
  10. html 表格选择滚动条,table设置tbody滚动条
  11. NoteBook / 期货及衍生品基础(5)
  12. 在Linux如何搭建Oracle11g Data Guard
  13. 空心三角形 C语言版
  14. 【Arcgis】图层的置顶与置底
  15. tomcat小版本升级
  16. Confluence迁移中遇到的问题(Data too long for column #39;STRINGVAL#39;)及解决方法
  17. Python模块之Pandas 格式化数据
  18. matlab 电化学程序,电化学软件 - 仿真模拟电化学系统
  19. 寻找中国最好百名产品经理:豆瓣阿北360周鸿祎
  20. 移植 SOEM 到嵌入式平台 STM32F767

热门文章

  1. [AtCoder Educational DP Contest] V - Subtree(树形dp + 前缀积/后缀积)
  2. 数论练习1 ( 曹冲养猪 + [POJ 2891]Strange Way to Express Integers + 乘法逆元【带证明】)
  3. hdu6356-Glad You Came【RMQ】
  4. nssl1196-摘果子【树形依赖背包,dp】
  5. POJ - 3415 Common Substrings(长度不小于K的公共子串个数)
  6. Codeforces Round #668 (Div. 2)
  7. 【DP】【容斥】Nice to Meet You(AT3634)
  8. 【SPFA】Party(jzoj 1328)
  9. 牛客网暑期ACM多校训练营(第九场)
  10. Java压缩技术(七) TAR——Commons实现