Maven集成测试和Spring Restful Services
- 我们使用Maven构建和单元测试一些基于Spring的静态Web服务。
- 然后,我们使用Maven Jetty插件启动Web服务器并将其部署到其中。
- 我们创建一个内存数据库并创建架构
- 最后,我们在单独的\ src \ integrationtest \ java目录中运行所有集成测试
代码结构
运行示例
完整代码托管在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 Restful Services相关推荐
- maven集成spring_Maven集成测试和Spring Restful Services
maven集成spring 介绍 我的原始博客通过一个非常简单的示例展示了如何分离Maven单元和集成测试. http://johndobie.blogspot.com/2011/06/seperat ...
- Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序
Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...
- Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序
Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...
- Spring Web Services 3.0.4.RELEASE和2.4.3.RELEASE发布
Spring同时发布了Web Services项目的两个版本:作为开发主干的3.0.4.RELEASE和作为运维的2.4.3.RELEASE.两个版本都已更新,可以在Spring Framework ...
- Spring系列学习之Spring Web Services
英文原文:https://spring.io/projects/spring-ws 目录 概述 特性 Spring Boot配置 快速开始 学习 文档 概述 Spring Web Services(S ...
- 大多数人忽略了的Spring官方项目,Spring Web Services
1.什么是Spring Web Service? 首先,不知道Web service的小伙伴,还需要,去了解下Web service 的相关知识再来看这篇文章.本文基于官方文档,作为基础. Sprin ...
- Springboot使用Maven Profile和Spring Profile进行多环境配置
Springboot使用Maven Profile和Spring Profile进行多环境配置 目的 在实际的项目上,一般会分三种环境dev.test.prod来方便我们的开发和部署,要求我们在开发的 ...
- pcf8523_PCF上的Spring Cloud合同和Spring Cloud Services
pcf8523 最近,我们有一个客户,对于使用Spring Cloud Contract (SCC)来防止微服务团队之间的API"漂移",微型开发团队会照顾个体的API(构成企业应 ...
- PCF上的Spring Cloud合同和Spring Cloud Services
最近,我们有一个客户,对于使用Spring Cloud Contract (SCC)来防止微服务团队之间的API"漂移",微型开发团队需要由单个开发团队来照顾构成企业应用程序一部分 ...
最新文章
- 多核之后,CPU 的发展方向是什么?中科院计算所包云岗提 20 点新思考
- python调用c++返回带成员指针的类指针
- 有趣的0-1背包问题:分割等和子集
- 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第15章-基于竞争关系的离散异构多智能体系统分组一致性
- 循环结构作业c语言,c语言循环结构练习题带答案
- linux centos 6.5压缩文件,CentOS 6.10 解压 rar压缩包
- Julia 排坑指南
- 华为(英国)招聘CPU/GPU架构及系统软件工程师
- 安装 深度wine_深度系统更新(2020.11.25)
- 对openflow 1.0协议的扩展
- python-判断一个字符串是目录还是文件及批处理方法
- 性能测试基本功 - Centos5.5下安装LAMP
- 原图像中的68个关键点是怎么获取_武汉课工场云计算培训:一级运动模型在动图中的应用...
- 手机端如何破解wifi密码
- openwrt路由器打印机服务器设置_OPENWRT网络打印机TCP/IP共享设置教程 以703N为例...
- 极验:验证码在黑灰产对抗中的角色和实践
- idea连接linux中mysql[08S01]错误
- 键盘win和alt互换了怎么改回
- 新一代iPhone后盖或将采用超级合金
- 如是古籍数字化工具平台介绍---自动秒级识别古籍OCR
热门文章
- XML——生成 XML 文档(读入 XML的反向过程)
- maven 构建增量包_使用Maven进行增量构建
- java 正则表达式 开头_如何在Java中修复表达式的非法开头
- spring jpa 流式_从响应式Spring Data存储库流式传输实时更新
- jdk11 jdk12_JDK 12附带紧凑数字格式
- lombok和maven_Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回
- ogm session_带有Hibernate OGM的NoSQL –第三部分:在WildFly上构建REST应用程序
- hazelcast入门教程_Hazelcast入门指南第4部分
- jdbc和jdbc驱动_JDBC布尔兼容性列表
- 布线问题分支限界法java_大型布线:Java云应用程序缺少的技术