maven集成spring_Maven集成测试和Spring Restful Services

maven集成spring

介绍
我的原始博客通过一个非常简单的示例展示了如何分离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

maven集成spring

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

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

相关文章

WebService.asmx架设后,显示调用按钮的方法

我们在VS本地调试WebService的时候&#xff0c;页面是可以调试的&#xff0c;如下图 但是在发布以后&#xff0c;通过浏览器访问服务器上的地址&#xff0c;是不能调试你的程序的&#xff0c;就变成了这个样子&#xff1a; 可以通过修改服务器上的web.config达到远程调试的效果…

复习者-Java EE 7概览

随着红帽JBoss企业应用平台7&#xff08;EAP 7&#xff09;的出现&#xff0c;甚至最近刚刚通过Java EE 7认证的WebLogic服务器&#xff0c;我认为现在应该为您重新介绍Java Enterprise Edition 7的时候了功能&#xff0c;并指向更多资源。 Java EE 7 –开发人员的生产力&…

按窗口文件php代码,在Windows命令行窗口中输入并运行PHP代码片段(不需要php文件)的方法...

有时候只是简单的为了测试某个php函数的效果&#xff0c;以前总是需要建一个php文件&#xff0c;复制这个文件的路径&#xff0c;再通过web访问或者用php命令执行这个php文件。一直想要怎么才能不用创建文件&#xff0c;才能直接执行PHP代码片段呢&#xff1f;终于找到了方法&a…

adf435编程_动态ADF列车:以编程方式添加列车停靠点

adf435编程我将展示如何以编程方式“即时”将火车停靠站添加到ADF火车中。 在我的用例中&#xff0c;我有一些票务预订应用程序。 它具有训练模型的有限任务流。 在火车的第一站&#xff0c;用户输入乘客数量&#xff0c;在随后的站点&#xff0c;他们输入一些乘客信息。 必须根…

JAVA消息服务JMS规范及原理详解

一、简介 JMS即Java消息服务&#xff08;Java Message Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面向消息中间件&#xff08;MOM&#xff09;的API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。Ja…

Fiddle用于移动端抓包

一、什么情况下可以用到 1、调查参考其他移动端网站的抓包&#xff0c;他们传输方式。如微信上京东的智能机器人的包、移动端的请求接口格式、如何实现的效果等。 2、调试本地移动端页面的测试页面效果是否有问题。如:页面的样式、js、结构等。 二、操作(http) a、安装猎豹免费…

php中得到复选框的数据的代码,表单复选框向PHP传输数据的代码

表单复选框向PHP传输数据的代码表单复选框就是checkbox1、checkbox的应用复制代码 代码如下:2、由于我传输的是在php循环中产生的数组&#xff0c;因此value也要设成变量&#xff1a;for($i0;$i<10;$i){?>">]" value"要传输的内容">]" v…

Kioptrix-2

环境搭建 这个靶场环境稍微有点麻烦&#xff0c;首次打开的时候&#xff0c;需要将靶机从VM中移除&#xff08;注意是 从VM里面移除&#xff09;&#xff0c;然后利用nodpad等工具打开vmx文件&#xff0c;然后两步&#xff1a; 所有以“ethernet0”开头的条目并保存更改。然后…

《中国文化要略》第八章 古代教育 第九章 科举制度

转载于:https://www.cnblogs.com/bgd140206319/p/6565654.html

Hamcrest Matchers教程

本文是我们名为“ 用Mockito进行测试 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入了解Mockito的魔力。 您将了解有关“模拟”&#xff0c;“间谍”和“部分模拟”的信息&#xff0c;以及它们相应的Stubbing行为。 您还将看到使用测试双打和对象匹配器进行验证的过…

win7下安装 python2 和python3

一直纠结于选择py2还是py3&#xff0c;不如在同一系统下安装两个版本就好了。 1、安装python2.7和python3.5 直接到官网https://www.python.org/下载&#xff0c;安装就可以了。 2.安装比较简单&#xff0c;点exe文件一直下一步就可以了&#xff08;注意&#xff1a;安装的时候…

谈谈你对oracle的认识,对Oracle存储过程的几点认识

1、写Oracle存储过程时最好不要在其中写Commit语句。一般调用程序会自动Commit数据&#xff0c;比如用NHibernate调用的时候&#xff0c;NHibernate就会自动Commi1、写Oracle存储过程时最好不要在其中写Commit语句。一般调用程序会自动Commit数据&#xff0c;&#xff0c;比如用…

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

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

VM虚拟机ping不通局域网其他主机的解决办法

1 我的笔记本的无线网卡是自动获取IP&#xff0c;并且是通过无线网卡上网。 2 我的有线网卡是通过自己设定IP跟局域网的其他机器连通。当前设定的IP为172.16.17.2 3我需要连接的局域网另一个主机为172.16.17.8&#xff0c;现在测试主机跟这个局域网的另一台主机是可以ping通的。…

linux命令画圣诞树图片,以 Linux 的方式庆祝圣诞节

原标题&#xff1a;以 Linux 的方式庆祝圣诞节当前正是假日季&#xff0c;很多人可能已经在庆祝圣诞节了。祝你圣诞快乐&#xff0c;新年快乐。为了延续节日氛围&#xff0c;我将向你展示一些非常棒的圣诞主题的 Linux 壁纸。在呈现这些壁纸之前&#xff0c;先来看一棵 Linux 终…

LINQ 学习路程 -- 查询语法 LINQ Query Syntax

1.查询语法 Query Syntax: from <range variable> in <IEnumerable<T> or IQueryable<T> Collection><Standard Query Operators> <lambda expression><select or groupBy operator> <result formation> // string collectio…

linux 权限提示信息,命令行快速提示:权限进阶 | Linux 中国

原标题&#xff1a;命令行快速提示&#xff1a;权限进阶 | Linux 中国本部分介绍使用权限管理文件访问和共享的其他方法。-- Paul W. Frields前一篇文章。本部分介绍使用权限管理文件访问和共享的其他方法。它建立在前一篇文章中的知识和示例的基础上&#xff0c;所以如果你还没…

nginx正确服务react-router应用

如今React应用普遍使用react-router作为路由管理&#xff0c;在开发端webpack自带的express服务器下运行和测试表现均正常&#xff0c;部署到线上的nginx服务器后&#xff0c;还需要对该应用在nginx的配置里作相应调整&#xff0c;否则浏览器将不能正常使用该应用&#xff0c;表…

linux中服务器之间的跳转,linux之***服务器间ip隧道跳转多ip路由走向分流(系真实案例)...

本文系统Centos6.0&#xff1b;这里的***服务以pptpd为例&#xff1b;其中底层涉及到pptpdfreeradiusmysql认证&#xff1b;本文系真实案例&#xff1b;leader需求大多是这样的&#xff0c;节约成本还要达到所需要的效果&#xff1b;没办法&#xff0c;总的做个效果出来&#x…

使用JBoss EAP 7的HTTP / 2

就在几天前&#xff0c;新的JBoss EAP 7 ALPHA版本已经发布。 而且我已经写过关于如何开始使用它的博客。 一个非常有趣的部分是HTTP / 2支持&#xff0c;它已作为技术预览添加。 它由新的Web服务器Untertow提供。 HTTP / 2通过压缩头并在同一TCP连接上多路复用多个流来减少延迟…