JUnit测试Spring Service和DAO(带有内存数据库)

这篇文章描述了如何为Spring Web Application的Services和DAO实现JUnit测试。 它建立在Spring MVC-Service-DAO-Persistence Architecture Example的基础上 。 从Github的Spring-Web-JPA-Testing目录中可以找到该示例。

提醒

  • 测试装置 –固定状态,用作运行测试的基准。
  • 单元测试 –这些测试验证代码(组件)片段是否按预期执行了某些功能。 在Java环境中,这些通常在类级别实现。
  • 集成测试 –集成测试是任何类型的测试检查,以确保一组交互的组件一起正确执行预期的功能。

组态

我们需要一个JPA Hibernate配置来进行内存中测试:

@Configuration
@EnableTransactionManagement
public class JpaTestConfig {@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){LocalContainerEntityManagerFactoryBean lcemfb= new LocalContainerEntityManagerFactoryBean();lcemfb.setDataSource(this.dataSource());lcemfb.setPackagesToScan(new String[] {'com.jverstry'});lcemfb.setPersistenceUnitName('MyTestPU');HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter();lcemfb.setJpaVendorAdapter(va);Properties ps = new Properties();ps.put('hibernate.dialect', 'org.hibernate.dialect.HSQLDialect');ps.put('hibernate.hbm2ddl.auto', 'create');lcemfb.setJpaProperties(ps);lcemfb.afterPropertiesSet();return lcemfb;}@Beanpublic DataSource dataSource(){DriverManagerDataSource ds = new DriverManagerDataSource();ds.setDriverClassName('org.hsqldb.jdbcDriver');ds.setUrl('jdbc:hsqldb:mem:testdb');ds.setUsername('sa');ds.setPassword('');return ds;}@Beanpublic PlatformTransactionManager transactionManager(){JpaTransactionManager tm = new JpaTransactionManager();tm.setEntityManagerFactory(this.entityManagerFactoryBean().getObject() );return tm;}@Beanpublic PersistenceExceptionTranslationPostProcessor exceptionTranslation(){return new PersistenceExceptionTranslationPostProcessor();}}

我们需要从软件包扫描中排除生产配置(不进行“ com.jverstry”扫描):

@Configuration
@ComponentScan(basePackages = {'com.jverstry.Controller','com.jverstry.DAO','com.jverstry.Item','com.jverstry.Service'
})public class TestConfig {@Beanpublic MyService getMyService() {return new MyServiceImpl();}}


弹簧测试工具

  • @RunWith –这是一个JUnit批注,它允许使用与JUnit提供的运行程序不同的运行程序运行测试。
  • SpringJUnit4ClassRunner –这是用于Spring应用程序的JUnit测试运行器。 通常,测试类使用@RunWith(SpringJUnit4ClassRunner.class)进行注释。
  • @ContextConfiguration –此批注可用于指定如何在Spring测试类中加载applicationContext。 可以通过XML文件或Java配置对象进行配置。

服务测试

以下类测试了注入的MyService实现的createAndRetrieve()方法:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={ JpaTestConfig.class, TestConfig.class })
public class MyServiceImplTest {@Autowiredprivate MyService myService;@Testpublic void testCreateAndRetrieve() {MilliTimeItem retr = myService.createAndRetrieve();assertNotNull(retr);}}


DAO测试

下面的类测试我们的DAO实现。 从上面定义的测试配置类创建的EntityManager注入了我们的实现。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={ JpaTestConfig.class, TestConfig.class })
public class MyPersistenceDAOTest {@Autowiredprivate MyPersistenceDAO myDAO;@Testpublic void testCreateMilliTimeItem() {// This operation should not throw an Exceptionlong id = myDAO.createMilliTimeItem();}@Testpublic void testGetMilliTimeItem() {long id = myDAO.createMilliTimeItem();MilliTimeItem retr = myDAO.getMilliTimeItem(id);assertNotNull(retr);assertEquals(id,retr.getID());}}


警告

开始为Spring编写JUnit测试时,可能会遇到以下错误消息:

Java.lang.ClassFormatError:
Absent Code attribute in method that is not native or abstract in class file javax/validation/Validation

上面的原因通常是由以下Maven依赖引起的:

<dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>6.0</version><type>jar</type></dependency>

它应该替换为:

<dependency><groupId>org.apache.geronimo.specs</groupId><artifactId>geronimo-jpa_2.0_spec</artifactId><version>1.1</version><scope>provided</scope></dependency>

另一个错误消息是:

javax.validation.ValidationException: Unable to find a default provider

通过添加以下Maven依赖关系可以解决此问题:

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.3.0.Final</version></dependency>

更多春天相关的帖子在这里 。

参考: 技术说明博客上的JCG合作伙伴 Jerome Versrynge的JUnit测试Spring Service和DAO(带有内存数据库) 。


翻译自: https://www.javacodegeeks.com/2012/10/junit-testing-spring-service-and-dao.html

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

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

相关文章

c# 正则获取html标签内容,c# – 使用正则表达式在多个HTML标记之间获取文本

使用正则表达式,我希望能够在多个DIV标记之间获取文本.例如,以下内容&#xff1a;first html taganother tag输出&#xff1a;first html taganother tag我使用的正则表达式模式只匹配我的最后一个div标签并错过了第一个.码&#xff1a;static void Main(string[] args){string…

Android之外部存储(SD卡)

*手机的外部存储空间&#xff0c;这个我们可以理解成电脑的外接移动硬盘&#xff0c;U盘也行。所有的Android设备都有两个文件存储区域&#xff1a;“内部”和“外部”存储器。这两个名称来自早期的Android&#xff0c;当时大多数设备都提供内置的固定的内存&#xff08;内置存…

通用并发对象池

在本文中&#xff0c;我们将介绍如何在Java中创建对象池。 近年来&#xff0c;JVM的性能成倍增加&#xff0c;大多数类型的对象几乎都变得多余&#xff0c;从而提高了对象池的性能。 从本质上讲&#xff0c;对象的创建不再像以前那样昂贵。 但是&#xff0c;有些对象在创建时肯…

圆周率的代码表示,以及对其的理解。

转载的简书&#xff0c;for 记录以及记忆。 http://www.jianshu.com/p/7208e4a58310 Thanks again&#xff01; 转载于:https://www.cnblogs.com/xiapeng0701/p/7538281.html

华为NOVa8Pr0是用鸿蒙系统吗,华为Nova8即将发布,采用麒麟芯片,高端平板适配鸿蒙系统...

大家好&#xff0c;我是老孙自从华为Mate40系列发布后&#xff0c;下一步新机动态备受外界关注&#xff0c;华为究竟会不会继续生产手机呢&#xff1f;答案是肯定&#xff0c;华为Nova8系列将于本月发布&#xff0c;华为P50系列也在积极筹备&#xff0c;而且都少不了麒麟芯片&a…

使用路标的Scala和Java的Twitter REST API

如果您已阅读此博客上的其他文章&#xff0c;您可能会知道我喜欢创建各种数据集的可视化。 我刚刚开始一个小项目&#xff0c;在这里我想可视化来自Twitter的一些数据。 为此&#xff0c;我想直接从Twitter检索有关关注者的信息和个人资料信息。 我实际上开始寻找一组所有推特帐…

大话设计模式读书笔记--11.抽象工厂模式

定义 抽象工厂模式定义: 提供一个创建一系列相关或相关依赖对象的接口,而无需指定他们具体的类 抽象工厂模式通常是用于创建一族产品&#xff0c;并且这族产品分不同的等级&#xff1b;不同的具体工厂类生产不同等级的一族产品 比如下图(来源于网络) 两厢车和三厢车称为两个不同…

在线压缩html,JS代码压缩 - javascript代码压缩 - jsmin在线js压缩工具

输入代码&#xff1a;// is.js// (c) 2001 Douglas Crockford// 2001 June 3// The -is- object is used to identify the browser. Every browser edition// identifies itself, but there is no standard way of doing it, and some of// the identification is deceptive. T…

Primefaces dataTable设置某个cell的样式问题

设置primefaces dataTable的源网段列的Cell可以编辑&#xff0c;当回车键保存时&#xff0c;判断是否输入的网段合法&#xff0c;如果不合法就显示警告信息&#xff0c;并将这个不合法的数据用红色表示。问题是&#xff0c;怎么给这一个cell设定样式。通过给标签设定ID然后在后…

鸭子在Java中打字? 好吧,不完全是

根据维基百科&#xff0c;鸭子的打字是&#xff1a; 动态类型的类型&#xff0c;其中对象的方法和属性确定有效的语义&#xff0c;而不是其从特定类或特定接口的实现继承 用简单的话 当我看到一只鸟走路像鸭子&#xff0c;游泳像鸭子&#xff0c;嘎嘎像鸭子一样时&#xff0c…

前端学习路线

第一部分 HTML 第一章 职业规划和前景 职业方向规划定位&#xff1a; web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 web前端开发的前景展望&#xff1a; 未来IT行业企业需求最多的人才 结合最新的html5抢占移动端的市场 自己创业做老板 随着互联网的普及we…

p1164【立方体求和】

题目&#xff1a; SubRaY有一天得到一块西瓜,是长方体形的....SubRaY发现这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小块都会有一个营养值(可能为负,因为西瓜是有可能坏掉的,但是绝对值不超过200).现在SubRaY决定从这…

html生成自定义表格,自定义js的表格插件

场景&#xff1a;指定元素&#xff0c;生成自定义表格。目的&#xff1a;了解js的插件开发。html代码&#xff1a;自定义表格插件var test new MyTable({elid:"mytable",//定义哪个div要生成表单thead:{//指定列名name:"姓名",age:"年龄",addr:…

使用JBehave,Gradle和Jenkins的行为驱动开发(BDD)

行为驱动开发 &#xff08;BDD&#xff09;是一个协作过程 &#xff0c;产品负责人&#xff0c;开发人员和测试人员可以合作交付可为企业带来价值的软件。 BDD是 测试驱动开发 &#xff08;TDD&#xff09; 的合理下一步 。 行为驱动的发展 本质上&#xff0c;BDD是一种交付…

手型显示html,css各种手型集合(css禁止手型)

html>css各种手型集合(css禁止手型).auto { cursor: auto; }.deafult { cursor: default; }.none { cursor: none; }.context-menu { cursor: context-menu; }.help { cursor: help; }.pointer { cursor: pointer; }.p…

Maven Fluido Skin和Javadoc类图

我使用Maven网站已有一段时间了&#xff0c;对此我感到非常满意。 我不想在Maven 3之后更新我的项目&#xff0c;但是没关系&#xff0c;Maven 3带来了许多新奇的东西。 但是&#xff0c;有两件事使我感到烦恼&#xff1a;缺乏美观和现代的外观&#xff0c;以及浏览复杂代码的J…

ZooKeeper安装,部署

实验环境 192.168.1.10  Zookeeper1:2181, Zookeeper2:2182 192.168.1.11  ZooKeeper3:2181 依赖环境 JDK1.7 安装&#xff0c;配置 1、下载解压 # 192.168.1.10cd /data/server tar -zxv -f zookeeper-3.4.6.tar.gz ln -s zookeeper-3.4.6 zookeeper1ln -s zookeeper-3.4.…

咸宁省2021年模拟高考成绩查询怎么查,2021咸宁市地区高考成绩排名查询,咸宁市高考各高中成绩喜报榜单...

距离2018年高考还有不到一个月的时间了&#xff0c;很多人在准备最后冲刺的同时&#xff0c;也在关心高考成绩。2018各地区高考成绩排名查询,高考各高中成绩喜报榜单尚未公布&#xff0c;下面是往年各地区高考成绩排名查询,高考各高中成绩喜报榜单&#xff0c;想要了解同学可以…

保证主题,JMS规范和ActiveMQ的消息传递

最近&#xff0c;一个客户要求我仔细研究ActiveMQ的“持久”消息的实现&#xff0c;它如何应用于主题以及在存在非持久订阅者的故障转移方案中会发生什么。 我已经了解到&#xff0c;JMS语义规定&#xff0c;即使面对消息代理提供者失败&#xff0c;也只能保证主题的持久订户以…

java中的除法及求余运算特殊性。

1.如果除法运算符的两个操作数都是整数类型&#xff0c;则计算结果也是整数&#xff0c;就是将自然除法的结果截断取整&#xff0c;例如19/4的结果是4&#xff0c;而不是5。并且除数不能0&#xff0c;否则将引起除0异常 2.如果运算符的两个操作数有1个是浮点数&#xff0c;或两…