介绍

我的原始博客通过一个非常简单的示例展示了如何分离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 Restful Services相关推荐

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

    maven集成spring 介绍 我的原始博客通过一个非常简单的示例展示了如何分离Maven单元和集成测试. http://johndobie.blogspot.com/2011/06/seperat ...

  2. Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON/Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  3. Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序

    Spring Restful Web服务示例 - 使用JSON,Jackson和客户端程序 Spring是最广泛使用的Java EE框架之一.我们之前已经看到了如何使用Spring MVC来创建基于J ...

  4. Spring Web Services 3.0.4.RELEASE和2.4.3.RELEASE发布

    Spring同时发布了Web Services项目的两个版本:作为开发主干的3.0.4.RELEASE和作为运维的2.4.3.RELEASE.两个版本都已更新,可以在Spring Framework ...

  5. Spring系列学习之Spring Web Services

    英文原文:https://spring.io/projects/spring-ws 目录 概述 特性 Spring Boot配置 快速开始 学习 文档 概述 Spring Web Services(S ...

  6. 大多数人忽略了的Spring官方项目,Spring Web Services

    1.什么是Spring Web Service? 首先,不知道Web service的小伙伴,还需要,去了解下Web service 的相关知识再来看这篇文章.本文基于官方文档,作为基础. Sprin ...

  7. Springboot使用Maven Profile和Spring Profile进行多环境配置

    Springboot使用Maven Profile和Spring Profile进行多环境配置 目的 在实际的项目上,一般会分三种环境dev.test.prod来方便我们的开发和部署,要求我们在开发的 ...

  8. pcf8523_PCF上的Spring Cloud合同和Spring Cloud Services

    pcf8523 最近,我们有一个客户,对于使用Spring Cloud Contract (SCC)来防止微服务团队之间的API"漂移",微型开发团队会照顾个体的API(构成企业应 ...

  9. PCF上的Spring Cloud合同和Spring Cloud Services

    最近,我们有一个客户,对于使用Spring Cloud Contract (SCC)来防止微服务团队之间的API"漂移",微型开发团队需要由单个开发团队来照顾构成企业应用程序一部分 ...

最新文章

  1. 多核之后,CPU 的发展方向是什么?中科院计算所包云岗提 20 点新思考
  2. python调用c++返回带成员指针的类指针
  3. 有趣的0-1背包问题:分割等和子集
  4. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第15章-基于竞争关系的离散异构多智能体系统分组一致性
  5. 循环结构作业c语言,c语言循环结构练习题带答案
  6. linux centos 6.5压缩文件,CentOS 6.10 解压 rar压缩包
  7. Julia 排坑指南
  8. 华为(英国)招聘CPU/GPU架构及系统软件工程师
  9. 安装 深度wine_深度系统更新(2020.11.25)
  10. 对openflow 1.0协议的扩展
  11. python-判断一个字符串是目录还是文件及批处理方法
  12. 性能测试基本功 - Centos5.5下安装LAMP
  13. 原图像中的68个关键点是怎么获取_武汉课工场云计算培训:一级运动模型在动图中的应用...
  14. 手机端如何破解wifi密码
  15. openwrt路由器打印机服务器设置_OPENWRT网络打印机TCP/IP共享设置教程 以703N为例...
  16. 极验:验证码在黑灰产对抗中的角色和实践
  17. idea连接linux中mysql[08S01]错误
  18. 键盘win和alt互换了怎么改回
  19. 新一代iPhone后盖或将采用超级合金
  20. 如是古籍数字化工具平台介绍---自动秒级识别古籍OCR

热门文章

  1. XML——生成 XML 文档(读入 XML的反向过程)
  2. maven 构建增量包_使用Maven进行增量构建
  3. java 正则表达式 开头_如何在Java中修复表达式的非法开头
  4. spring jpa 流式_从响应式Spring Data存储库流式传输实时更新
  5. jdk11 jdk12_JDK 12附带紧凑数字格式
  6. lombok和maven_Lombok,AutoValue和Immutables,或如何编写更少,更好的代码返回
  7. ogm session_带有Hibernate OGM的NoSQL –第三部分:在WildFly上构建REST应用程序
  8. hazelcast入门教程_Hazelcast入门指南第4部分
  9. jdbc和jdbc驱动_JDBC布尔兼容性列表
  10. 布线问题分支限界法java_大型布线:Java云应用程序缺少的技术