Spring+EasyMock对Service层方法进行测试,处理@Resource属性
2013-08-28 18:59
585 查看
这次说说怎么对Service层方法进行测试,同时弄清楚怎么来处理@Resource、@Autowired属性。
通过实例来描述:
有一个Service类,如下:
public class SysEmployeeService{
@Resource
private SysEmployeeDao sysEmployeeDao;
/**
*
* 获取所有员工信息.
*
* @param page
* 页数
* @param rows
* 条数
* @return Object
*/
public Pagination<Object> getAllEmployees(int page, int rows) {
return this.sysEmployeeDao.getAllEmployees(page, rows);
}
}
现在要对getAllEmployees方法进行单元测试,代码如下:
/**
* @author lisanlai <br />
* Mail: sanlai_lee@qq.com <br />
* Blog:http://blog.lisanlai.cn <br />
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/META-INF/spring/sellmanager-context.xml",
"/META-INF/spring/dao-context.xml",
"/META-INF/spring/mvc-context.xml" })
public class SysEmployeeServiceTest {
@Resource
private SysEmployeeService sysEmployeeService;
/**
* Test method for {@link com.cmcc.zysoft.sysmanage.service.SysEmployeeService#getAllEmployees(int, int)}.
*/
@Test
public void testGetAllEmployees() {
IMocksControl control = EasyMock.createControl();
//创建虚拟对象
SysEmployeeDao mockSysEmployeeDao = control.createMock(SysEmployeeDao.class);
int page = 1;
int rows = 20;
//创建虚拟对象方法期望的返回值
int totalPages = 20;
int offset = 1;
int limit = 20;
int totalRecords = 400;
Pagination<Object> pagination = new Pagination<Object>(totalPages, offset, limit, totalRecords);
//录制动作
EasyMock.expect(mockSysEmployeeDao.getAllEmployees(page, rows)).andReturn(pagination) ;
//回放动作
control.replay();
//用spring提供的方法注入aurowired的字段
ReflectionTestUtils.setField(
unwrap(sysEmployeeService),
"sysEmployeeDao",
mockSysEmployeeDao,
SysEmployeeDao.class);
//执行测试方法
Pagination<Object> p = sysEmployeeService.getAllEmployees(page, rows);
Assert.assertArrayEquals("SysEmployeeService.GetAllEmployees方法逻辑错误",
new int[]{totalPages,offset,limit,totalRecords},
new int[]{(int)p.getTotalPages(),p.getOffset(),p.getLimit(),(int)p.getTotalRecords()});
//验证是否使用了上面录制的DAO
EasyMock.verify(mockSysEmployeeDao);
}
/**
* Method Name:unwrap .
* @param proxiedInstance
* @return
* the return type:T
*/
@SuppressWarnings("unchecked")
public static <T> T unwrap(T proxiedInstance) {
if (proxiedInstance instanceof Advised) {
try {
return unwrap((T) ((Advised) proxiedInstance).getTargetSource().getTarget());
} catch (Exception e) {
Assert.fail("对代理对象进行unwrap发生异常:" + proxiedInstance.getClass());
}
}
return proxiedInstance;
}
}
虽然上面这段代码只是一个实例,但是它已经很好的遵守了单元测试的原则,实现了方法之前的隔离,对于部分人估计对这个代码理解有点困难,因为没弄清楚什么是隔离,为什么要隔离。
对于@Resource、@Autowired属性,我们可以利用Spring提供的一个类来处理:ReflectionTestUtils
例如上面的:
ReflectionTestUtils.setField(
unwrap(sysEmployeeService),
"sysEmployeeDao",
mockSysEmployeeDao,
SysEmployeeDao.class);
通过实例来描述:
有一个Service类,如下:
public class SysEmployeeService{
@Resource
private SysEmployeeDao sysEmployeeDao;
/**
*
* 获取所有员工信息.
*
* @param page
* 页数
* @param rows
* 条数
* @return Object
*/
public Pagination<Object> getAllEmployees(int page, int rows) {
return this.sysEmployeeDao.getAllEmployees(page, rows);
}
}
现在要对getAllEmployees方法进行单元测试,代码如下:
/**
* @author lisanlai <br />
* Mail: sanlai_lee@qq.com <br />
* Blog:http://blog.lisanlai.cn <br />
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "/META-INF/spring/sellmanager-context.xml",
"/META-INF/spring/dao-context.xml",
"/META-INF/spring/mvc-context.xml" })
public class SysEmployeeServiceTest {
@Resource
private SysEmployeeService sysEmployeeService;
/**
* Test method for {@link com.cmcc.zysoft.sysmanage.service.SysEmployeeService#getAllEmployees(int, int)}.
*/
@Test
public void testGetAllEmployees() {
IMocksControl control = EasyMock.createControl();
//创建虚拟对象
SysEmployeeDao mockSysEmployeeDao = control.createMock(SysEmployeeDao.class);
int page = 1;
int rows = 20;
//创建虚拟对象方法期望的返回值
int totalPages = 20;
int offset = 1;
int limit = 20;
int totalRecords = 400;
Pagination<Object> pagination = new Pagination<Object>(totalPages, offset, limit, totalRecords);
//录制动作
EasyMock.expect(mockSysEmployeeDao.getAllEmployees(page, rows)).andReturn(pagination) ;
//回放动作
control.replay();
//用spring提供的方法注入aurowired的字段
ReflectionTestUtils.setField(
unwrap(sysEmployeeService),
"sysEmployeeDao",
mockSysEmployeeDao,
SysEmployeeDao.class);
//执行测试方法
Pagination<Object> p = sysEmployeeService.getAllEmployees(page, rows);
Assert.assertArrayEquals("SysEmployeeService.GetAllEmployees方法逻辑错误",
new int[]{totalPages,offset,limit,totalRecords},
new int[]{(int)p.getTotalPages(),p.getOffset(),p.getLimit(),(int)p.getTotalRecords()});
//验证是否使用了上面录制的DAO
EasyMock.verify(mockSysEmployeeDao);
}
/**
* Method Name:unwrap .
* @param proxiedInstance
* @return
* the return type:T
*/
@SuppressWarnings("unchecked")
public static <T> T unwrap(T proxiedInstance) {
if (proxiedInstance instanceof Advised) {
try {
return unwrap((T) ((Advised) proxiedInstance).getTargetSource().getTarget());
} catch (Exception e) {
Assert.fail("对代理对象进行unwrap发生异常:" + proxiedInstance.getClass());
}
}
return proxiedInstance;
}
}
虽然上面这段代码只是一个实例,但是它已经很好的遵守了单元测试的原则,实现了方法之前的隔离,对于部分人估计对这个代码理解有点困难,因为没弄清楚什么是隔离,为什么要隔离。
对于@Resource、@Autowired属性,我们可以利用Spring提供的一个类来处理:ReflectionTestUtils
例如上面的:
ReflectionTestUtils.setField(
unwrap(sysEmployeeService),
"sysEmployeeDao",
mockSysEmployeeDao,
SysEmployeeDao.class);
相关文章推荐
- spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-mock.jar来进行辅助测试,正式应用系统中是用不得这些类的
- spring 或springboot对controller层方法进行测试
- spring与springboot中,如何在static方法里用@Autowire或者@Resource注入的属性
- 使用方法拦截器MethodInterceptor和AOP统一处理log (Spring的拦截器 对方法进行拦截 ))
- springAOP进行自定义注解,用于方法的处理
- http://sourceforge.net/projects/easymock/ ant结合junit进行软件自动测试
- ######Spring第5天ssh整合(注解版)难理解知识点:【自定义 方法加注解的方式】给dao注入sessionFactory属性+【搞清@Autowared和@Resource含义】
- Spring中通过stter方法,构造器两种形式对属性进行初始化
- [单元测试]PowerMock+SpringMVC整合并测试Controller层方法(一)
- [单元测试]PowerMock+SpringMVC整合并测试Controller层方法(二)
- spring容器创建bean时对属性中含有日期的处理方法
- mock SpringMVC 测试控制器方法
- 【异常处理】Springboot对Controller层方法进行统一异常处理
- 关于spring事务处理,service层方法上加锁数据没有更新
- 利用Mockito进行mock方法时有无返回值的处理
- spring中使用@RequestBody,对应的bean中属性名大写注入为空的解决方法
- Spring中BeanUtils.copyProperties方法测试
- .net core如何利用ConcurrentTest组件对方法进行压力测试详解
- 使用Angular CLI进行单元测试和E2E测试的方法
- 使用dcmtk进行worklist服务的测试方法