NoSQLUnit 0.3.0发布

介绍

单元测试是一种验证应用程序中可测试的最小部分的方法。 单元测试必须遵循FIRST规则; 这些是快速,隔离,可重复,自我验证和及时的。
考虑到没有持久层(典型的关系数据库或新的NoSQL数据库)的JEE应用程序很奇怪,因此编写持久层的单元测试也应该很有趣。 当我们编写持久层的单元测试时,我们应该专注于不破坏FIRST规则的两个主要概念,即快速规则和隔离规则。

如果他们不访问网络或文件系统,则我们的测试将很快,并且在持久性系统的情况下,网络和文件系统是最常用的资源。 对于RDBMS (SQL),存在许多Java内存数据库,例如Apache DerbyH2HSQLDB 。 顾名思义,这些数据库已嵌入到您的程序中,并且数据存储在内存中,因此您的测试仍然很快。 问题在于NoSQL系统,因为它们具有异质性。 一些系统使用Document方法(例如MongoDb ),其他Column(例如Hbase )或Graph(例如Neo4J )工作。 因此,供应商应提供内存模式,没有通用的解决方案。

我们的测试必须与自己隔离。 一种测试方法修改另一种测试方法的结果是不可接受的。 在持久性测试的情况下,当前一个测试方法向数据库插入一个条目,而下一个测试方法执行找到更改时,就会发生这种情况。 因此,在执行每个测试之前,应该以已知状态找到数据库。 请注意,如果您的测试发现数据库处于已知状态,则测试将是可重复的,如果测试断言取决于先前的测试执行,则每个执行都是唯一的。 对于RDBMS之类的同类系统,存在DBUnit来在每次执行之前将数据库保持在已知状态。 但是还没有用于异构NoSQL系统的DBUnit框架。

NoSQLUnit通过提供一个JUnit扩展来解决此问题,该扩展可以帮助我们管理NoSQL系统的生命周期,并有助于将数据库维护为已知状态。

NoSQLUnit

NoSQLUnit是一个JUnit扩展,它使使用NoSQL后端的系统的编写单元测试和集成测试更加容易,它由两组规则和一组注释组成。
第一组规则是负责管理数据库生命周期的规则 ; 每个受支持的后端都有两个。

  • 第一个(如果可能的话)它是内存模式。 此模式负责以“内存中”模式启动和停止数据库系统。 此模式通常在单元测试执行期间使用。
  • 第二个是托管模式。 此模式负责启动NoSQL服务器,但作为远程进程(在本地计算机中)并停止它。 通常在集成测试执行期间使用。

第二组规则是负责将数据库保持为已知状态的规则 。 每个受支持的后端都有自己的后端,可以理解为与已定义数据库的连接,该数据库将用于执行所需的操作以维护系统的稳定性。

请注意,由于NoSQL数据库是异构数据库,因此每个系统都需要自己的实现。
最后提供了两个注释, @UsingDataSet@ShouldMatchDataSet (非常感谢Arquillian的名字),用于指定数据集和预期数据集的位置。

MongoDb示例

现在,我将解释一个非常简单的示例,说明如何使用NoSQLUnit,要全面了解所提供的所有功能,请阅读链接中的文档或以pdf格式下载 。
要使用MongoDB的使用NoSQLUnit你只需要添加下一依赖性:

<dependency><groupId>com.lordofthejars<groupId><artifactId>nosqlunit-mongodb<artifactId><version>0.3.0<version><dependency>

第一步是定义测试所需的生命周期管理策略。 根据您要实施的测试类型(单元测试,集成测试,部署测试等),您将需要内存方式, 托管方式或远程方式。

对于此示例,我们将使用通过ManagedMongoDb规则使用托管方法),但请注意,还支持内存中 MongoDb管理(请参见文档说明)。

下一步是配置Mongodb规则, 规则负责通过插入和删除定义的数据集来将MongoDb数据库保持在已知状态。 您必须注册MongoDbRule JUnit规则类,该类需要一个配置参数,其中包含主机,端口或数据库名称之类的信息。

为了简化开发人员的生活并使代码更易读,可以使用流畅的界面来创建这些配置对象。

让我们看一下代码:

首先是一个简单的POJO类,它将用作模型类:

public class Book {private String title;private int numberOfPages;public Book(String title, int numberOfPages) {super();this.title = title;this.numberOfPages = numberOfPages;}public void setTitle(String title) {this.title = title;}public void setNumberOfPages(int numberOfPages) {this.numberOfPages = numberOfPages;}public String getTitle() {return title;}public int getNumberOfPages() {return numberOfPages;}}

下一业务类负责管理对MongoDb服务器的访问:

public class BookManager {private static final Logger LOGGER = LoggerFactory.getLogger(BookManager.class);private static final MongoDbBookConverter MONGO_DB_BOOK_CONVERTER = new MongoDbBookConverter();private static final DbObjectBookConverter DB_OBJECT_BOOK_CONVERTER = new DbObjectBookConverter();private DBCollection booksCollection;public BookManager(DBCollection booksCollection) {this.booksCollection = booksCollection;}public void create(Book book) {DBObject dbObject = MONGO_DB_BOOK_CONVERTER.convert(book);booksCollection.insert(dbObject);}}

现在该进行测试了。 在下一个测试中,我们将验证一本书是否已正确插入数据库。

package com.lordofthejars.nosqlunit.demo.mongodb;public class WhenANewBookIsCreated {@ClassRulepublic static ManagedMongoDb managedMongoDb = newManagedMongoDbRule().mongodPath('optmongo').build();@Rulepublic MongoDbRule remoteMongoDbRule = new MongoDbRule(mongoDb().databaseName('test').build());@Test@UsingDataSet(locations='initialData.json', loadStrategy=LoadStrategyEnum.CLEAN_INSERT)@ShouldMatchDataSet(location='expectedData.json')public void book_should_be_inserted_into_repository() {BookManager bookManager = new BookManager(MongoDbUtil.getCollection(Book.class.getSimpleName()));Book book = new Book('The Lord Of The Rings', 1299);bookManager.create(book);}}

看到首先,我们正在使用ClassRule注释创建与MongoDb服务器的托管连接。 在这种情况下,我们将以编程方式配置MongoDb路径,但也可以从MONGO_HOME环境变量进行设置。 请参见此处所有可用参数的完整说明。

加载测试时将执行此规则 ,并将启动MongoDb实例。 执行完所有测试后,还将关闭服务器。

Next Rule在任何测试方法之前执行,负责将数据库保持在已知状态。 注意,我们仅配置工作数据库,在本例中为测试数据库。

最后,我们用@UsingDataSet注释方法测试,指示执行每个测试之前要在哪里找到要插入的数据,并@ShouldMatchDataSet定位预期的数据集。

{'Book':[{'title':'The Hobbit','numberOfPages':293}]}
{'Book':[{'title':'The Hobbit','numberOfPages':293},{'title':'The Lord Of The Rings','numberOfPages':1299}]}

我们正在设置文件initialData.json初始数据集位于classpath中COM / lordofthejars / nosqlunit /演示/ MongoDB的/ initialData.json和预期的数据集叫expectedData.json。

最后说明

虽然NoSQLUnit是在早期阶段,MongoDB中的部分几乎已经完成,在接下来的版本中的新功能,当然还有新的数据库将得到支持。 下一个NoSQL支持的引擎将是Neo4JCassandraHBaseCouchDb

另请阅读文档 ,您将在此处找到对每个功能的完整说明。

最后,您的任何建议,任何建议或任何建议都将受到欢迎。

保持学习!

完整代码

参考: NoSQLUnit 0.3.0从我们的JCG合作伙伴 Alex Soto在“ 一个罐子统治所有”博客上发布。


翻译自: https://www.javacodegeeks.com/2012/06/nosqlunit-030-released.html

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

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

相关文章

proftpd java_Proftpd:编译安装

下载 proftpd# wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.5a.tar.gz# wget https://github.com/proftpd/proftpd/archive/v1.3.5a.tar.gz# yum -y install gcc openssl-devel# ./configure --prefix/usr/local/proftpd/ \--sysconfdir/usr/local/proftpd/ \--ena…

javascript 相关小的知识点集合

本文主要是列出一些javascript 相关的&#xff0c;不限于javascript的&#xff0c;容易记错或者遗忘的小知识&#xff0c;小技巧。 1、javascript中的false 在 JavaScript&#xff0c;常见的 false 值&#xff1a; 0, 0, 0, -0, false, ,null,undefined,NaN 要注意空数组([])和…

AOS – 另外一个独特的页面滚动动画库(CSS3)

AOS 是一个用于在页面滚动的时候呈现元素动画的工具库&#xff0c;你可能会觉得它和 WOWJS 一样&#xff0c;的确他们效果是类似的。但是AOS是 CSS3 动画驱动的库&#xff0c;当你滚动页面的时候能让元素动起来&#xff0c;当页面滚回顶部的时候&#xff0c;元素能够回到前一个…

关于Java包

我希望我们都同意&#xff0c;方法和类应该很小&#xff0c;并且只有很少的依赖关系。 这种观点被广泛接受&#xff0c;而对“小”的解释则各不相同。 关于这一点有很多文献。 但是包裹呢&#xff1f; 有些人将包视为名称空间。 因此&#xff0c;包只是允许您为类重用名称的东西…

python中打开文件时只允许写入的模式是_详解python中各种文件打开模式

在python中&#xff0c;总的来说有三种大的模式打开文件,分别是:a, w, r当以a模式打开时&#xff0c;只能写文件&#xff0c;而且是在文件末尾添加内容。当以a模式打开时&#xff0c;可以写文件&#xff0c;也可读文件&#xff0c;可是在读文件的时候&#xff0c;会发现读出来的…

KVM 基本硬件容量扩容

在工作当中如果虚拟机的容量不够使用 如何添加呢&#xff1f; CPU添加 cpu添加有两种方式&#xff1a; 1 创建虚拟机的时候可以添加 # virt-install --help | grep cpu--vcpusVCPUS Number of vcpus to configure for your guest. Ex:--vcpus 5--vcpus 5,maxcpus10--vcpu…

JavaFX 2.0 Hello World

在讨论示例本身之前&#xff0c;我想向您展示如何在NetBeans中创建JavaFX应用程序。 &#xff08;如果尚未安装JavaFX和NetBeans&#xff0c;请参阅我以前的文章《 安装JavaFX 2.0和NetBeans 7.7.1》 &#xff09;单击“文件”菜单中的“新建项目”以打开项目向导。 然后选择“…

java 线程强制停止线程_java多线程之停止线程

在多线程开发中停止线程是非常重要的技术点。停止线程在Java语言中并不像break语句那样干脆。须要一些技巧性的处理。一、 异常法採用异常法来停止一个线程。首先我们须要了解一下两个方法的使用方法&#xff1a;1、interrupt()方法public class MyThread extends Thread{Over…

Android 上下文菜单(Context Menu)

一、概述 Android中&#xff0c;上下文菜单是通过onLongClick(...)事件访问的。在事件触发后显示菜单项。 在使用上下文菜单时&#xff0c;通常在onCreate(...)方法中&#xff0c;先行注册上下文菜单。在实现onCreateContextMenu(...)方法和onContextItemSelected(...)方法。 注…

RGB颜色空间alpha混合的方法

http://blog.csdn.net/xhhjin/article/details/6444782http://blog.csdn.net/xhhjin/article/details/6445460http://www.cnblogs.com/graphics/archive/2012/08/23/2643086.htmlhttp://www.oschina.net/code/snippet_1425046_27446 转载于:https://www.cnblogs.com/eustoma/p/…

Java怪异实践

总览 Java中有许多实践使我感到困惑。 这里只是一些。 使用-Xmx和-Xms 选项-Xmx广泛用于设置最大内存大小。 如Java HotSpot VM Options中所述&#xff0c;以-X开头的选项是非标准的&#xff08;不保证在所有VM实现中均受支持&#xff09;&#xff0c;并且在以后的JDK发行版中…

saml java实现_java-saml

软件简介java-saml 是 Java 的 SAML 开发包。Maven&#xff1a;com.oneloginjava-saml2.4.0示例代码&#xff1a;Map samlData new HashMap<>();samlData.put("onelogin.saml2.sp.entityid", "http://localhost:8080/java-saml-tookit-jspsample/metadat…

双系统Ubuntu分区扩容过程记录

本人电脑上安装了Win10 Ubuntu 12.04双系统。前段时间因为在Ubuntu上做项目要安装一个比较大的软件&#xff0c;导致Ubuntu根分区的空间不够了。于是&#xff0c;从硬盘又分出来一部分空间&#xff0c;分给Ubuntu。于是有了这篇Ubuntu扩容过程记录&#xff0c;也可以当作是一篇…

使用MongoDB的MapReduce

MapReduce是Google在2004年推出的一种软件框架&#xff0c;用于支持对计算机集群中的大数据集进行分布式计算。 您可以从此处阅读有关MapReduce的信息 。 MongoDB是用C 编写的面向开源文档的NoSQL数据库系统。 您可以从此处阅读有关MongoDB的更多信息。 1.安装MangoDB。 请遵…

java epson指令集_EPSON机械手 SPEL+语言指令集

下面是全部指令的简明列表&#xff0c;放在这里方便参考。之后重要的指令&#xff0c;勇哥要拿出来单独学习。系统管理相关命令Reset 将控制器重置为初始状态。SysConfig 显示系统设置参数。SysErr 返回最新的错误状态或警告状态。Date 显示日期。Time 显示时间。Date$ 以字符串…

1、关于action中解决跨域请求问题:

&#xff08;1&#xff09;、action中使用ajax传值时HttpServletRequest request ServletActionContext.getRequest(); String origin request.getHeader("Origin"); HttpServletResponse response ServletActionContext.getResponse(); response.setContentType(…

dom contains 包含关系

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>contains</title></head><body> <div id"p-node"> <div id"c-node">子节点内容&…

ANTLR:入门

这篇文章使您了解ANTLR的基础知识。 以前&#xff0c;我们已经了解了如何将ANTLR设置为外部工具。 在这里&#xff1a; ANTLR外部工具 :) 所以&#xff0c;我们开始…。 什么是ANTLR&#xff1f; •另一个语言识别工具&#xff0c;是一种语言工具&#xff0c;它提供了一个框架…

安装JAVA8要登录_JDK8的安装及环境配置

原文链接:https://www.cnblogs.com/chenxj/p/10137221.html1、下载JDK&#xff1b;b、或百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1S14y4_3eN9G6oOVfhmbe_w提取码&#xff1a;0cf62、双击安装程序&#xff0c;点击下一步安装目录若不修改&#xff0c;可直…

【学习笔记】JavaScript基础(一)

【学习过程遇到疑问和延伸阅读】 1.document.write()的深入理解write()方法可向文档写入HTML表达式或JavaScript代码。可使用document.write()向输出流写文本或者HTML 延伸阅读《js中document.write的那点事》http://www.cnblogs.com/dh616854836/articles/2140349.html 2.编程…