dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)(二)
来源:互联网 发布:黑客网络攻击银行 编辑:程序博客网 时间:2024/05/19 01:08
上一篇说到powermock的配置,我一般在测试类中再加上继承spring的测试类:extends AbstractTransactionalJUnit4SpringContextTests ,这样就基本可以了。
再来说说上一篇中使用的spring配置文件。主要的不同就是test-spring.xml里面不会包含哪些引用外部服务的consumer,也就是剔除外部dubbo服务。
但是代码里有很多注入外部服务的地方,这如何处理呢?这是第三个问题:
3.注入外部的服务:
开始我想了个很笨的方法:在test/文件夹下给外部服务的接口都提供一个空的实现类(implements 接口,然后用eclpse生成默认的方法实现)。这样基本上就可以启动了。但是实际使用中,由于外部服务接口也在不断修改中,会出现不同环境的接口类不一至的情况。比如uat环境的jar包多了或一个方法(虽然我们的程序没有直接使用),如此一来,我自己搞的空实现类就会报编译错误了。
后来想到了一个方法,在/test的代码中增加一个普通的@Conponent注解的类,类里面使用@Bean注解标明所有外部类的生成方法
@Componentpublic class MockedOuterBeanFactory {@Beanpublic OuterService outerSerive(){return Mocktio.mock(OuterService.class);}}
然后在测试类中注入这个MockedOuterBeanFactory,这样测试环境的spring就可以完整的启动了。外部的服务在启动后都是Mocktio生成的代理类,所有方法都会返回默认值。
在实际测试中如何打桩呢?也很简单。
如果我测试一个自己写的服务(如MyService),MyService又注入了OuterService(外部服务),那么利用spring Bean注入的单例这个特性就可以完成。在MyService的测试类中(MyServiceTest.java),同样也注入OuterService,在执行MyService的方法之前对OuterService进行打桩。那么由于bean是单例的,MyServiceTest中注入的OuterService实例就是MyService注入的实例。这样就轻松完成了打桩的工作。如果有特殊原因,main中配置的bean不是单例的,那么可以的话,在test-spring.xml中把它配置为单例的就可以。如果确实情况特殊不允许配置为单例方式,看下一篇吧。
启动后
解决了spring启动的问题,然后呢?数据库
4.测试数据库的选择
有时候,我们需要测试持久化的内容,比如分页查询,不能说测试覆盖了代码就可以,还需要验证查询到的数据是否符合要求。参考了dbunits之类的东西,最后还是觉得之前使用的h2database是最好的选择。它可以使用内存模式,不需要外部数据库的依赖。这样单元测试才能独立运行。配置很简单,
首先加入依赖:
<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId>
<version>1.4.191</version></dependency>至于版本,就自己找个最新的吧。
然后在数据源的地方使用如下配置(这也是测试环境spring配置不同于main配置的主要位置):
<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"destroy-method="close"><property name="poolProperties"><bean class="org.apache.tomcat.jdbc.pool.PoolProperties"><property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=1;MODE=MySQL"/><property name="driverClassName" value="org.h2.Driver" /><property name="username" value="" /><property name="password" value=""/><property name="validationQuery" value="SELECT 1"/><property name="maxActive" value="8" /><property name="minIdle" value="1"/><property name="maxIdle" value="4" /><property name="maxWait" value="10000"/><property name="initialSize" value="1"/></bean></property></bean>
注意:MODE=MySQL,这是让h2模拟mysql库,如果你使用其他类型的库,一般也会有对应的Mode,主流数据库都支持。注意mem项,意思是内存数据库,这样配置根本不会生成数据库文件的,特别适合单元测试(依赖外部环境就不是标准单元测试了)。至于数据源类型,按自己的工程的配置就好,只要使用h2的url和driver就行,这里用的是tomcat数据源。
这些配置都做好后,就可以运行真正的powermock,mockito,springtest的单元测试了。下一篇说说怎么测试aop的类。
- dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)(二)
- dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)(一)
- dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)(三)
- 使用 PowerMock 以及 Mockito 实现单元测试
- 使用Powermock和mockito来进行单元测试
- 使用Powermock和mockito来进行单元测试
- PowerMock与Mockito的使用
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- 使用MRUnit,Mockito和PowerMock进行Hadoop MapReduce作业的单元测试
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- 单元测试从Mockito到PowerMock再到Robolectric的详细解析
- 二.Android单元测试 Mockito的更多用法
- Android单元测试(二):Mockito框架的使用
- PowerMock处理特殊的单元测试
- JUnit + Mockito 单元测试(二)
- JUnit + Mockito 单元测试(二)
- 单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境
- 排序之冒泡排序
- FJ的字符串
- jQuery.trigger() 函数详解
- Linux常用命令
- 彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义http请求
- dubbo应用程序的单元测试环境搭建(springtest,powermock,mockito)(二)
- phpstudy遇到80端口占用
- 图算法之求两点之间的所有路径(java)
- 关于js的引用类型
- 输出类似于 刚刚, 4分钟前, 一小时前, 昨天这样的时间
- Android 启动页面与广告页面的实现
- 数组的常见操作
- 牛客网——去哪儿网——二分查找
- 基于MCP2515的Linux CAN总线驱动程序设计(一)