Maven集成测试和Spring Restful Services

介绍
我的原始博客通过一个非常简单的示例展示了如何分离Maven单元和集成测试。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后,许多人要求我提供比最初使用的示例更实际的示例。 这篇文章展示了如何在实际环境中(实际将应用程序部署到服务器上)使用原始方法拆分单元测试和集成测试。
  • 我们使用Maven构建和单元测试一些基于Spring的静态Web服务。
  • 然后,我们使用Maven Jetty插件启动Web服务器并将其部署到其中。
  • 我们创建一个内存数据库并创建架构
  • 最后,我们在单独的\ src \ integrationtest \ java目录中运行所有集成测试
本文旨在直接展示在运行集成测试之前,如何以实际方式使用Maven来启动一组服务并将其部署到正在运行的服务器上。 它与REST或Spring MVC的微妙细节无关。 我将对此进行简单介绍,以构建一个可运行的应用程序,同时为那些需要更多细节的人提供更深入的文章参考。

代码结构

运行示例

完整代码托管在Google代码上。 使用以下命令将其检出并运行。 在运行测试之前,请确保端口8080上没有任何运行。

svn co https://designbycontract.googlecode.com/svn/trunk/examples/maven/spring-rest-example
cd spring-rest-example
mvn clean install -Pit,jetty

您可以在以下Cloudbees托管的Jenkins实例上查看完整版本。 https://designbycontract.ci.cloudbees.com/job/spring-rest-example/

运行示例的结果

  • 标准的Maven测试结构中的测试照常在单元测试阶段运行。
  • Jetty Web服务器启动
  • 包含Web服务器的战争已部署到服务器
  • 已启动hsqldb内存数据库并创建了架构。
  • \ src \ integrationtest \ java目录中的测试在集成测试阶段运行。
  • 服务器已关闭。

如何创建Spring Service类

贸易服务非常简单。 它使用存储库来创建和查找交易。 我没有包含使整个事情尽可能简单的例外。 这里唯一的技巧是添加@Service批注,否则它是直接的Java。

@Service
public class SimpleTradeService implements TradeService {@AutowiredTradeRepository tradeRepository; public SimpleTradeService(TradeRepository tradeRepository)  {this.tradeRepository = tradeRepository;}@Overridepublic Long createTrade(Trade t) {Long id = tradeRepository.createTrade(t);return id;}@Overridepublic Trade getTradeById(Long id) {return tradeRepository.getTradeById(id);}

如何创建数据库存储库类

上面的服务使用交易存储库来创建和查找交易。 我们使用Spring类HibernateDaoSupoort来创建此类,并使事情保持简单。 通过扩展此类,我们只需要创建我们的交易对象类,并在spring config中定义我们的数据库详细信息即可。 该框架负责所有其他细节。

public class HibernateTradeRepository  extends HibernateDaoSupport implements TradeRepository{@Overridepublic Trade getTradeByReference(String reference) {throw new RuntimeException();}@Overridepublic Long createTrade(Trade trade) {return (Long) getHibernateTemplate().save(trade);}@Overridepublic Trade getTradeById(Long id) {return getHibernateTemplate().get(Trade.class, id);}
}

如何创建数据库交易类

我们使用标准的JPA批注定义我们的数据库交易对象

@Entity
public class Trade {@Idprivate long id;

@Entity批注将对象标记为数据库实体。 @Id注释显示了我们希望成为表主键的字段。 对于其余字段,我们使用默认行为,因此不需要其他注释。

如何配置数据库

对于此示例,我们将使用Hsqldb创建我们的数据库。 http://hsqldb.org/每次我们启动服务器时都会创建一个新的实例。 要设置数据库,我们要做的就是在spring config trade-servlet.xml中定义它

<bean id="sessionFactory"   
<bean id="sessionFactory"  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="packagesToScan"value="com.dbc.model" /><property name="hibernateProperties"><props><prop key="hibernate.show_sql">true</prop><prop key="hibernate.format_sql">true</prop><prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop><prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop><prop key="hibernate.connection.pool_size">0</prop><prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop><prop key="hibernate.connection.url">jdbc:hsqldb:target/data/tradedatabase;shutdown=true</prop><prop key="hibernate.connection.username">sa</prop><prop key="hibernate.connection.password"></prop><prop key="hibernate.connection.autocommit">true</prop><prop key="hibernate.jdbc.batch_size">0</prop><prop key="hibernate.hbm2ddl.auto">update</prop></props></property></bean>

会话工厂定义我们的数据库连接详细信息。 最重要的属性是

<prop key="hibernate.hbm2ddl.auto">update</prop>

该属性告诉hibernate在应用程序启动时更新数据库。 它将根据我们交易对象上的注释有效地为交易对象创建表。 运行测试时,您将看到在启动时执行以下SQL。

11:30:31,899 DEBUG org.hibernate.tool.hbm2ddl.SchemaUpdate SchemaUpdate:203 
- create table 
Trade (id bigint          not null, description        varchar(255), reference          varchar(255), primary key (id))

多数民众赞成在一个新的数据库设置,并准备就绪。

创建宁静的界面。

我将在这里介绍基础知识。 对于一些很棒的例子,请遵循以下链接http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/ http://www.stupidjavatricks.com/?p=54

如何创建Spring控制器

Spring控制器是整个示例的关键。 是控制器接受我们的请求并将其传递给贸易服务部门进行处理。 它定义了restful接口。 我们使用@PathVariable使事情变得简单。

@RequestMapping(value = "/create/trade/{id}")
public ModelAndView createTrade(@PathVariable Long id) {Trade trade = new Trade(id); service.createTrade(trade);ModelAndView mav = new ModelAndView("tradeView", BindingResult.MODEL_KEY_PREFIX + "trade", trade);return mav;
}@RequestMapping(value = "/find/trade/{id}")
public ModelAndView findTradeById(@PathVariable Long id) {Trade trade = service.getTradeById(id);ModelAndView mav = new ModelAndView("tradeView", BindingResult.MODEL_KEY_PREFIX + "trade", trade);return mav;
}

通过使用来自/ find / trade / {id}的值填充@PathVariable id可以非常简单地工作,例如,请求/ find / trade / 1会将引用填充为“ 1”,而请求/ find / trade / 29则将填充引用为“ 29”可在此处找到更多信息: http : //static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates

如何配置Web应用程序

web.xml中Web应用程序的配置非常简单。 首先我们注册Spring Servlet

tradeorg.springframework.web.servlet.DispatcherServlet1

接下来,我们定义到servlet的映射。 该映射会将所有请求传递给我们的servlet。

trade/*

如何配置Spring

Spring配置由许多不同的元素组成。 第一行只是告诉Spring在哪里寻找注释

BeanNameViewResolver使用名称

看起来很恐怖的XML可以确保将Trade对象作为XML返回。 XStream将获取对象,并自动将其转换为XML格式。

Trade类为此定义了XStream注释。

@XStreamAlias("trade")
public class Trade {

在我们的例子中,您可以从测试中看到,我们从/ search / trade / 1获得了以下内容

1

如何启动和停止Jetty服务器

我使用Jetty插件启动服务器并部署包含服务的war文件。 http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin服务器使用pom.xml中的以下代码段启动服务器

<execution><id>start-jetty</id><phase>pre-integration-test</phase><goals><goal>run</goal></goals>
</execution>

使用pom.xml中的以下代码片段停止服务器

<execution><id>stop-jetty</id><phase>post-integration-test</phase><goals><goal>stop</goal></goals>
</execution>

如何运行集成测试

集成测试使用原始文章中所述的故障保护运行。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html我们使用新的Spring RestTemplate来简化对服务的调用。

@Test
public void testGetTradeFromRestService() throws Exception {long id = 10L;createTrade(id);String tradeXml = new RestTemplate().getForObject("http://localhost:8080/find/trade/{id}",String.class, id);System.out.println(tradeXml);Trade trade = getTradeFromXml(tradeXml);assertEquals(trade.getId(), id);
}

参考: Agile Engineering Techniques博客上来自JCG合作伙伴 John Dobie的Maven集成测试和Spring Restful Services 。


翻译自: https://www.javacodegeeks.com/2012/05/maven-integration-testing-and-spring.html

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

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

相关文章

玩cf出现outofmemory_CF画质粗糙平衡感人,却能历经十年经久不衰,靠的是什么?...

Hello大家好&#xff0c;我是沐辰。《穿越火线》这款游戏国内运营时间已长达十年&#xff0c;从最早接触这款游戏开始&#xff0c;很多玩家都在这里烙刻下了许多关于青春的回忆。CF的许多问题一直颇受诟病&#xff0c;例如落后且粗糙的画质、英雄级武器与平民武器的巨大差距、千…

jquery遍历ajax返回的json数据

我们以前在前端遍历ajax拿到的数据一般都是用for或其他方式遍历&#xff0c;这样做麻烦且费事&#xff0c;效率不高&#xff0c;下面提供一个函数&#xff0c;只需调用函数即可把数据遍历出来&#xff0c;方便高效。 html代码&#xff1a; <html> <head><script…

Apache JMeter:随心所欲进行负载测试

这是有关使用Apache JMeter进行负载测试的第二篇文章&#xff0c;请在此处阅读第一篇文章&#xff1a; 有关对关系数据库进行负载测试的分步教程。 JMeter有很多采样器 。 如果您需要JMeter不提供的采样器&#xff0c;则可以编写自定义采样器。 &#xff08;自定义采样器在JMet…

致敬词

见义勇为致敬词 面对灾难和死神&#xff0c;你们大义凛然、知险而上&#xff0c;把平安和生机留给他人&#xff0c;把困难和危险留给自己。巍巍乎高山景行&#xff0c;铮铮然铁骨侠风&#xff1b;壮志谱传奇&#xff0c;热血写春秋。你们是&#xff1a;百姓英雄&#xff0c;平安…

经常使用计算机的孩子,常玩电脑对孩子负面影响大,家长们不容小觑!

相信不少的家庭都会备有电脑&#xff0c;人们在网络世界里面能够找到自己需要的东西。不仅是大人喜欢玩电脑&#xff0c;小孩也喜欢玩电脑。然而常玩电脑对孩子负面影响大吗&#xff1f;有多大&#xff1f;一、行为问题全国青少年教育协会指出&#xff0c;5岁以下的使用电脑的孩…

VMware下ubuntu与Windows实现文件共享的方法

最近安装caffe需要将Windows下文件拷贝到ubuntu16.04下&#xff0c;就进行了共享文件夹的设置&#xff0c;期间遇到一些困难&#xff0c;记录下来&#xff0c;方便以后遇到此类问题不再困惑。 &#xff08;记录只为更好的分享&#xff09; 言归正传&#xff1a; 1、首先需要在u…

mybatis入门-新手注意问题

参数问题 在映射文件中通过parameterType指定输入参数的类型&#xff1b;在映射文件中通过resultType指定输出结果的类型。 占位符和拼接符问题 #{}表示一个占位符号&#xff0c;#{}接收输入参数&#xff0c;类型可以是简单类型&#xff0c;pojo、hashmap。 如果接收简单类型&a…

远程桌面连接时无法访问远程计算机的计算机属性提示系统调用失败,远程过程调用失败【应对技巧】...

喜欢使用电脑的小伙伴们一般都会遇到win7系统远程过程调用失败的问题&#xff0c;突然遇到win7系统远程过程调用失败的问题就不知道该怎么办了&#xff0c;其实win7系统远程过程调用失败的解决方法非常简单&#xff0c;按照1&#xff1a;第一步我们可以看到sql server数据库出现…

库卡机器人C4计算机无法启动,KUKA-C4标准版机器人启动时序

描述1.T1模式下选择CELL程序&#xff0c;手动执行程序&#xff0c;注意中间路径&#xff0c;有时机器人不在HOME点附近&#xff0c;回原点的过程中需慢速运行&#xff0c;直至到达BCO。2.松开执行键&#xff0c;重新按下&#xff0c;信息栏出现“运行方式错误”提示&#xff0c…

ADF:将UI类别与动态表单一起使用

JDev 11g R2具有有趣的新功能“ UI类别”。 它使我们可以在视图对象定义级别上以声明方式对VO的属性进行分组。 例如&#xff0c;我的VEmployees视图对象的“ UI Categories”选项卡如下所示&#xff1a; 默认情况下&#xff0c;每个视图对象都有一个预定义的类别“默认”。 我…

Exchange超级实用命令行

发现Powershell很强大以后&#xff0c;就欲罢不能了。来点干货 有PST文件的没有成功导出&#xff0c;原因是执行时会报错&#xff0c;说需要64位Outlook&#xff0c;dotnet4.5以上环境。还有说法是Exchange2010开始不支持PST导入导出。 整理了一下最近尝试比较实用的命令&#…

位数不足前面补0mysql语句_全网热议:监控补光灯爆亮闪瞎眼!你遇到过吗?

唔知大家有无咁ga体会每当夜晚揸车经过一排监控补光灯瞬间像“瞎子”那样看不到东西&#xff0c;“威力”堪比远光灯(△ 11月12日晚&#xff0c;安定门外大街&#xff0c;主路上的监控补光灯)近日&#xff0c;“监控补光灯太刺眼&#xff0c;给夜间行车安全造成极大隐患”一事引…

4种常见的 PHP 设计模式

工厂模式 在大型系统中&#xff0c;许多代码依赖于少数几个关键类。需要更改这些类时&#xff0c;可能会出现困难。例如&#xff0c;假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类&#xff0c;但是&#xff0c;所有的代码都引用从文件读取的原始类。…

安装卡主_智能温室四周玻璃的安装学问还这么多

智能玻璃温室大棚是指顶部及四周以玻璃为覆盖材料的尖顶温室大棚&#xff0c;玻璃温室大棚这几年的流行是由于纹络型温室顶部阳光板问题的抗老化方面容易出现问题。因此很多客户为了种植获得更高的透光率&#xff0c;更长的使用年限&#xff0c;因而多选择全玻璃温室大棚。那么…

String类详解(1)

首先String是一个类。  1&#xff0c;实例化String类方法。 1&#xff09;直接赋值&#xff1a;String name"haha"; 2)通过关键字&#xff1a;String namenew String("haha"); 2&#xff0c;String类的数据比较。 首先回顾一下&#xff0c;基础数据的比较…

WebApi Post 后台无法获取参数的解决方案

事件回放&#xff1a; 之前一段时间&#xff0c;公司里前端用的Angularjs 发送http请求也是用的ng的组件&#xff0c;后台是.Net的WebApi 前端 var data {PArgs: {PageIndex: 0,PageSize: 8,RowsCount: 0} };$http.post("/Api/Test/ABC", data).success(function (d…

南京大学计算机系周小莉,周会群

媒体报道&#xff1a;南京大学周会群&#xff1a;用计算机聪明地做实验Q《中国教育网络》A周会群Q&#xff1a;南京大学的高性能计算中心非常特殊&#xff0c;分布在物理&#xff0c;化学、天文、地球科学四个不同的学科中&#xff0c;为什么采取这种模式&#xff1f;A&#xf…

不要怂,就是GAN (生成式对抗网络) (五):无约束条件的 GAN 代码与网络的 Graph...

GAN 这个领域发展太快&#xff0c;日新月异&#xff0c;各种 GAN 层出不穷&#xff0c;前几天看到一篇关于 Wasserstein GAN 的文章&#xff0c;讲的很好&#xff0c;在此把它分享出来一起学习&#xff1a;https://zhuanlan.zhihu.com/p/25071913。相比 Wasserstein GAN &#…

用于MyBatis CRUD操作的Spring MVC 3控制器

到目前为止&#xff0c;我们已经为域类“ User ”创建了CRUD数据库服务&#xff0c;并且还将MyBatis配置与Spring Configuration文件集成在一起。 接下来&#xff0c;我们将使用Spring MVC创建一个网页&#xff0c;以使用MyBatis CRUD服务对数据库执行操作。 使用MyBatis 3创建…

2pin接口耳机_拆解报告:雷柏首款真无线耳机XS200

-----我爱音频网拆解报告第185篇-----雷柏是一家历史悠久的鼠标和键盘厂商&#xff0c;截至目前&#xff0c;雷柏(rapoo)总共出了四款耳机&#xff0c;此前曾推出过三款蓝牙耳机&#xff0c; 分别是S500 蓝牙立体声麦克风耳机&#xff0c;S200 蓝牙立体声麦克风耳机&#xff0c…