使用TestNG的弹簧测试支持

TestNG是一个测试框架,旨在涵盖所有类别的测试:单元,功能,端到端,集成等。 它包括许多功能,例如灵活的测试配置,对数据驱动测试的支持(使用@DataProvider),强大的执行模型(不再需要TestSuite)(等等)。

弹簧测试支持涵盖了基于弹簧的应用程序的单元和集成测试的非常有用和重要的功能。 org.springframework.test.context.testng包为基于TestNG的测试用例提供支持类。 本文展示了如何通过使用Spring和TestNG集成来测试Spring Service层组件。 下一篇文章还将展示如何使用相同的集成来测试Spring Data Access层组件。

二手技术:

JDK 1.6.0_31
春天3.1.1
测试NG 6.4 Maven的3.0.2

步骤1:建立已完成的专案

如下创建一个Maven项目。 (可以使用Maven或IDE插件来创建它)。

步骤2:图书馆

Spring依赖项已添加到Maven的pom.xml中。

<properties><spring.version>3.1.1.RELEASE</spring.version></properties><dependencies><!-- Spring 3 dependencies --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!-- TestNG dependency --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.4</version></dependency><!-- Log4j dependency --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency></dependencies>

步骤3:建立使用者类别

创建一个新的用户类。

package com.otv.user;/*** User Bean** @author  onlinetechvision.com* @since   19 May 2012* @version 1.0.0**/
public class User {private String id;private String name;private String surname;/*** Gets User Id** @return String id*/public String getId() {return id;}/*** Sets User Id** @param String id*/public void setId(String id) {this.id = id;}/*** Gets User Name** @return String name*/public String getName() {return name;}/*** Sets User Name** @param String name*/public void setName(String name) {this.name = name;}/*** Gets User Surname** @return String Surname*/public String getSurname() {return surname;}/*** Sets User Surname** @param String surname*/public void setSurname(String surname) {this.surname = surname;}@Overridepublic String toString() {StringBuilder strBuilder = new StringBuilder();strBuilder.append("Id : ").append(getId());strBuilder.append(", Name : ").append(getName());strBuilder.append(", Surname : ").append(getSurname());return strBuilder.toString();}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());result = prime * result + ((surname == null) ? 0 : surname.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;User other = (User) obj;if (id == null) {if (other.id != null)return false;} else if (!id.equals(other.id))return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;if (surname == null) {if (other.surname != null)return false;} else if (!surname.equals(other.surname))return false;return true;}
}

步骤4:创建NonExistentUserException类

NonExistentUserException类已创建。

package com.otv.common.exceptions;/*** Non Existent User Exception** @author  onlinetechvision.com* @since   19 May 2012* @version 1.0.0**/
public class NonExistentUserException extends Exception {private static final long serialVersionUID = 1L;public NonExistentUserException(String message) {super(message);}
}

第5步:创建ICacheService接口

创建了代表缓存服务接口的ICacheService接口。

package com.otv.cache.service;import java.util.concurrent.ConcurrentHashMap;import com.otv.user.User;/*** Cache Service Interface** @author  onlinetechvision.com* @since   19 May 2012* @version 1.0.0**/
public interface ICacheService {/*** Gets User Map** @return ConcurrentHashMap User Map*/ConcurrentHashMap<String, User> getUserMap();}

步骤6:创建CacheService类

CacheService类是通过实现ICacheService接口创建的。 它提供对远程缓存的访问…

package com.otv.cache.service;import java.util.concurrent.ConcurrentHashMap;import com.otv.user.User;/*** Cache Service Implementation** @author  onlinetechvision.com* @since   19 May 2012* @version 1.0.0**/
public class CacheService implements ICacheService {//User Map is injected...private ConcurrentHashMap<String, User> userMap;/*** Gets User Map** @return ConcurrentHashMap User Map*/public ConcurrentHashMap<String, User> getUserMap() {return userMap;}/*** Sets User Map** @param ConcurrentHashMap User Map*/public void setUserMap(ConcurrentHashMap<String, User> userMap) {this.userMap = userMap;}}

步骤7:建立IUserService介面

创建了代表用户服务接口的IUserService接口。

package com.otv.user.service;import java.util.Collection;import com.otv.common.exceptions.NonExistentUserException;
import com.otv.user.User;/**** User Service Interface** @author  onlinetechvision.com* @since   19 May 2012* @version 1.0.0**/
public interface IUserService {/*** Adds User** @param  User user* @return boolean whether delete operation is success or not.*/boolean addUser(User user);/*** Deletes User** @param  User user* @return boolean whether delete operation is success or not.*/boolean deleteUser(User user);/*** Updates User** @param  User user* @throws NonExistentUserException*/void updateUser(User user) throws NonExistentUserException;/*** Gets User** @param  String User Id* @return User*/User getUserById(String id);/*** Gets User Collection** @return List - User list*/Collection<User> getUsers();
}

步骤8:创建UserService类

通过实现IUserService接口创建UserService类。

package com.otv.user.service;import java.util.Collection;
import com.otv.cache.service.ICacheService;
import com.otv.common.exceptions.NonExistentUserException;
import com.otv.user.User;/**** User Service** @author  onlinetechvision.com* @since   19 May 2012* @version 1.0.0**/
public class UserService implements IUserService {//CacheService is injected...private ICacheService cacheService;/*** Adds User** @param  User user* @return boolean whether delete operation is success or not.*/public boolean addUser(User user) {getCacheService().getUserMap().put(user.getId(), user);if(getCacheService().getUserMap().get(user.getId()).equals(user)) {return true;}return false;}/*** Deletes User** @param  User user* @return boolean whether delete operation is success or not.*/public boolean deleteUser(User user) {User removedUser = getCacheService().getUserMap().remove(user.getId());if(removedUser != null) {return true;}return false;}/*** Updates User** @param  User user* @throws NonExistentUserException*/public void updateUser(User user) throws NonExistentUserException {if(getCacheService().getUserMap().containsKey(user.getId())) {getCacheService().getUserMap().put(user.getId(), user);} else {throw new NonExistentUserException("Non Existent User can not update! User : "+user);}}/*** Gets User** @param  String User Id* @return User*/public User getUserById(String id) {return getCacheService().getUserMap().get(id);}/*** Gets User List** @return Collection - Collection of Users*/public Collection<User> getUsers() {return (Collection<User>) getCacheService().getUserMap().values();}/*** Gets Cache Service** @return ICacheService - Cache Service*/public ICacheService getCacheService() {return cacheService;}/*** Sets Cache Service** @param ICacheService - Cache Service*/public void setCacheService(ICacheService cacheService) {this.cacheService = cacheService;}}

步骤9:创建UserServiceTester类

通过扩展AbstractTestNGSpringContextTests创建用户服务测试器类。

package com.otv.user.service.test;import junit.framework.Assert;import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;import com.otv.common.exceptions.NonExistentUserException;
import com.otv.user.User;
import com.otv.user.service.IUserService;/*** User Service Tester Class** @author  onlinetechvision.com* @since   19 May 2012* @version 1.0.0**/
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class UserServiceTester extends AbstractTestNGSpringContextTests {private static Logger logger = Logger.getLogger(UserServiceTester.class);@Autowiredprivate IUserService userService;private User firstUser;private User secondUser;private User thirdUser;/*** Creates Test Users**/private void createUsers() {firstUser = new User();firstUser.setId("1");firstUser.setName("Lionel");firstUser.setSurname("Messi");secondUser = new User();secondUser.setId("2");secondUser.setName("David");secondUser.setSurname("Villa");thirdUser = new User();thirdUser.setId("3");thirdUser.setName("Andres");thirdUser.setSurname("Iniesta");}/*** Asserts that User Properties are not null.** @param User*/private void assertNotNullUserProperties(User user) {Assert.assertNotNull("User must not be null!", user);Assert.assertNotNull("Id must not be null!", user.getId());Assert.assertNotNull("Name must not be null!", user.getName());Assert.assertNotNull("Surname must not be null!", user.getSurname());}/*** The annotated method will be run before any test method belonging to the classes* inside the <test> tag is run.**/@BeforeTestpublic void beforeTest() {logger.debug("BeforeTest method is run...");}/*** The annotated method will be run before the first test method in the current class* is invoked.**/@BeforeClasspublic void beforeClass() {logger.debug("BeforeClass method is run...");createUsers();}/*** The annotated method will be run before each test method.**/@BeforeMethodpublic void beforeMethod() {logger.debug("BeforeMethod method is run...");} /*** Tests the process of adding user**/@Testpublic void addUser() {assertNotNullUserProperties(firstUser);Assert.assertTrue("User can not be added! User : " + firstUser, getUserService().addUser(firstUser));}/*** Tests the process of querying user**/@Testpublic void getUserById() {User tempUser = getUserService().getUserById(firstUser.getId());assertNotNullUserProperties(tempUser);Assert.assertEquals("Id is wrong!", "1", tempUser.getId());Assert.assertEquals("Name is wrong!", "Lionel", tempUser.getName());Assert.assertEquals("Surname is wrong!", "Messi", tempUser.getSurname());}/*** Tests the process of deleting user**/@Testpublic void deleteUser() {assertNotNullUserProperties(secondUser);Assert.assertTrue("User can not be added! User : " + secondUser, getUserService().addUser(secondUser));Assert.assertTrue("User can not be deleted! User : " + secondUser, getUserService().deleteUser(secondUser));}/*** Tests the process of updating user* @throws NonExistentUserException**/@Test(expectedExceptions = NonExistentUserException.class)public void updateUser() throws NonExistentUserException {getUserService().updateUser(thirdUser);}/*** Test user count**/@Testpublic void getUserCount() {Assert.assertEquals(1, getUserService().getUsers().size());}/*** The annotated method will be run after all the test methods in the current class have been run.**/@AfterClasspublic void afterClass() {logger.debug("AfterClass method is run...");}/*** The annotated method will be run after all the test methods belonging to the classes inside the <test> tag have run.**/@AfterTestpublic void afterTest() {logger.debug("AfterTest method is run...");}/*** The annotated method will be run after each test method.**/@AfterMethodpublic void afterMethod() {logger.debug("AfterMethod method is run...");}/*** Gets User Service** @return IUserService User Service*/public IUserService getUserService() {return userService;}/*** Sets User Service** @param IUserService User Service*/public void setUserService(IUserService userService) {this.userService = userService;}}

步骤10:创建applicationContext.xml

应用程序上下文的创建如下:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- User Map Declaration --><bean id="UserMap" class="java.util.concurrent.ConcurrentHashMap" /><!-- Cache Service Declaration --><bean id="CacheService" class="com.otv.cache.service.CacheService"><property name="userMap" ref="UserMap"/></bean><!-- User Service Declaration --><bean id="UserService" class="com.otv.user.service.UserService"><property name="cacheService" ref="CacheService"/></bean>
</beans>

步骤11:运行项目

在本文中,已使用TestNG Eclipse插件。 如果使用Eclipse,则可以通过TestNG下载页面下载它

如果运行UserServiceTester ,则测试用例的结果如下所示:

步骤12:下载

OTV_SpringTestNG

参考资料:
Spring测试支持
TestNG参考

参考: Online Technology Vision博客中的JCG合作伙伴 Eren Avsarogullari 提供的TestNG的Spring测试支持 。


翻译自: https://www.javacodegeeks.com/2012/05/spring-testing-support-with-testng.html

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

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

相关文章

Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

注&#xff1a;本文针对的是 Entity Framework Code First 场景。 之前写过三篇文章试图理清Entity Framework中的一对一关系&#xff08;单相思&#xff08;单向一对一&#xff09;, 两情相悦&#xff08;双向一对一&#xff09;, 两情相悦-续&#xff09;&#xff0c;但当时理…

微信社交小程序服务器,Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端...

要搞一个小型的cms内容发布系统因为小程序上线之后&#xff0c;直接对数据库进行操作的话&#xff0c;慧出问题的&#xff0c;所以一般都会做一个管理系统&#xff0c;让工作人员通过这个管理系统来对这个数据库进行增删改查微信小程序其实给我们提供了这样的能力了(也就是可以…

文件共享服务器imac,iMac怎么在网络上共享设备windows文件夹和服务 | MOS86

本章通过向您展示如何在网络和Mac和Windows计算机之间共享文件&#xff0c;文件夹和设备&#xff0c;帮助您充分利用您的iMac网络连接。→使用Macs共享文件和文件夹使用AirDrop和文件共享→与Windows 7计算机共享文件→设置共享权限→使用共享表快速在线共享文件→共享和访问网…

【转】 简单理解Socket

题外话 前几天和朋友聊天&#xff0c;朋友问我怎么最近不写博客了&#xff0c;一个是因为最近在忙着公司使用的一些控件的开发&#xff0c;浏览器兼容性搞死人&#xff1b;但主要是因为这段时间一直在看html5的东西&#xff0c;看到web socket时觉得很有意思&#xff0c;动手写…

业务活动监视器(BAM)2.0带来的革命

生产兼具精益和企业价值的中间件是一项艰巨的工作。 它要么不存在&#xff0c;要么需要创新的思维&#xff08;很多&#xff09;&#xff0c;并且需要在实现中反复进行。 业务风险很大&#xff0c;但是如果您做对了&#xff0c;它就会使您领先于其他任何公司。 这就是为什么我们…

oracle销售服务器吗,oracle 服务器 版本

oracle 服务器 版本 内容精选换一换Atlas 800 训练服务器(型号 9010)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 训练服务器 用户指南 (型号9010)》。Atlas 800 训练服务器(型号 9010)适配操作系统如表1所示。请参考表2下载驱动和固件包。Atlas 800 训…

html 甘特图_Rplotly|交互式甘特图(Gantt chart)项目管理/学习计划

甘特图(Gantt chart)&#xff0c;又常被称为横道图或者条状图&#xff0c;是现代企业项目管理领域运用最为广泛的一种图示。就是通过条形来显示项目的进度、时间安排等相关情况的。项目管理外&#xff0c;也可以用来管理学习计划。绘制甘特图的工具有很多&#xff0c;本文介绍使…

Oracle Coherence:分布式数据管理

本文介绍如何使用Oracle Coherence提供分布式&#xff08;分区&#xff09;数据管理。 在下面的示例应用程序中&#xff0c;创建了一个名为OTV的新集群&#xff0c;并且在该集群的两个成员之间分配了一个名为user-map的缓存对象。 二手技术&#xff1a; JDK 1.6.0_21 Maven的…

美团点评DBProxy读写分离使用说明

目的 因为业务架构上需要实现读写分离&#xff0c;刚好前段时间美团点评开源了在360Atlas基础上开发的读写分离中间件DBProxy&#xff0c;关于其介绍在官方文档已经有很详细的说明了&#xff0c;其特性主要有&#xff1a;读写分离、负载均衡、支持分表、IP过滤、sql语句黑名单、…

apriori算法c++_关联分析——基于Apriori算法实现

电子商务推荐系统主要是通过统计和挖掘技术&#xff0c;根据用户在网站上的行为,主动为用户提供推荐服务&#xff0c;从而提高网站体验。而根据不同的业务场景&#xff0c;推荐系统需要满足不同的推荐粒度&#xff0c;包括搜索推荐,商品类目推荐,商品标签推荐&#xff0c;店铺推…

在Oracle Coherence中分发Spring Bean

本文展示了如何通过使用Oracle Coherence中的EntryProcessor和可移植对象格式&#xff08;POF&#xff09;功能来分发Spring Bean。 Coherence通过EntryProcessor API支持无锁编程模型。 此功能通过减少网络访问并在条目上执行隐式的低级锁定来提高系统性能。 此隐式低级锁定功…

Apache Commons SCXML:有限状态机实现

本文提到有限状态机&#xff08;FSM&#xff09;&#xff0c;SCXML&#xff08;状态图可扩展标记语言&#xff09;和Apache Common的SCXML库。 本文还提供了基本的ATM有限状态机示例代码。 有限状态机&#xff1a; 您可能还记得计算机科学课程中的有限状态机。 FSM用于设计计算…

pymol怎么做底物口袋表面_怎么从文献中发掘一篇新文章?

本文来自微信公众号&#xff1a;X-MOLNews可能你的导师也曾说过这样的话——盯着Nature、Science级别的文章做&#xff0c;可能最终会中十分的文章&#xff1b;如果盯着十分的文章做&#xff0c;可能最终发出来也就五六分&#xff1b;但如果就为了发个文章混毕业&#xff0c;很…

如何分析线程转储– IBM VM

本文是我们的线程转储分析系列的第4部分&#xff0c;它将为您概述什么是IBM VM的JVM线程转储以及您将找到的不同线程和数据点。 您将看到和学习​​到&#xff0c;IBM VM Thread Dump格式是不同的&#xff0c;但是提供了更多现成的故障排除数据。 在这一点上&#xff0c;您应该…

VMware vSphere克隆虚拟机

参考资料&#xff1a;http://blog.csdn.net/shen_jz2012/article/details/484167711. 首先将你所要克隆的虚拟机关掉2. 选择你的ESXI服务器选中"配置"&#xff0c;然后选中存储器右键你的存储介质&#xff0c;比如我的是datastore1&#xff0c;选择“浏览数据存储”。…

windows命令行无法启动redis_windows系统安装redis

1、下载最新redis https://github.com/MicrosoftArchive/redis/releases我选择下载msi版本的2.双击下载包安装3.设置redis环境变量&#xff0c;把redis路径配置到系统变量path值中4启动redis&#xff0c;cmd进入安装好redis文件夹 输入&#xff1a;如果redis启动出错Creating S…

OpenShift Express Web管理控制台:入门

本周&#xff0c; 最新版本的OpenShift为已经很棒的PaaS Cloud提供商带来了两个非常好的功能。 首先&#xff0c;JBoss AS已从7.0升级到7.1&#xff0c;并且所有新的Express Web Management Console已作为预览发布。 在本文中&#xff0c;我们将研究如何使用此新控制台&#xf…

女士细线毛衣起多少针_从起针到缝合,教你织毛衣的各种要点(详细教程)

新手学织毛衣看过来&#xff0c;7大编织要点帮你解决织好一件毛衣的基础问题&#xff0c;满满的干货&#xff0c;每点都值得学习!一、起针二、棒针符号三、如何织小样四、依据小样推算针数收挂肩的推算五、斜肩针数的推算开前、后领的位置与针数六、袖山的推算七、如何上袖子一…

Jelastic Java云端平台

谁在Jelastic背后&#xff1f; 那是我的第一个问题&#xff0c;因此我浏览了Jelastic网站。 回答此问题的最佳方法是查看“ Jelastic团队”部分。 创始人&#xff0c;顾问&#xff0c;特殊合作伙伴构成了一支真正的专业团队。 作为特殊的合作伙伴&#xff0c;您会发现MySQL&am…

请先设置tkk_搅拌站水泥罐仓顶除尘器设置及调整

搅拌站水泥罐仓顶除尘器采用脉冲喷吹清灰系统&#xff0c;除尘器本体结构&#xff0c;采用标准模板焊接&#xff0c;整体结构&#xff0c;强度牢靠&#xff0c;组装维修方便&#xff0c;脉冲清灰采用时序控制器MCY系列 控制阀门KEK系列&#xff0c;喷吹清灰频率及喷吹间隔可手…