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 {
  @Autowired
  TradeRepository tradeRepository; 
 
  public SimpleTradeService(TradeRepository tradeRepository)  {
    this.tradeRepository = tradeRepository;
  }
 
  @Override
  public Long createTrade(Trade t) {
    Long id = tradeRepository.createTrade(t);
    return id;
  }

  @Override
  public Trade getTradeById(Long id) {
    return tradeRepository.getTradeById(id);
  }

如何创建数据库存储库类

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

public class HibernateTradeRepository  extends HibernateDaoSupport implements TradeRepository{
  @Override
  public Trade getTradeByReference(String reference) {
       throw new RuntimeException();
  }

  @Override
  public Long createTrade(Trade trade) {
      return (Long) getHibernateTemplate().save(trade);
  }

  @Override
  public Trade getTradeById(Long id) {
      return getHibernateTemplate().get(Trade.class, id);
  }
}

如何创建数据库交易类

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

@Entity
public class Trade {
 @Id
 private 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

trade
   org.springframework.web.servlet.DispatcherServlet
   1

接下来,我们定义到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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值