Spring服务层的测试JMock

Spring服务层的测试JMock

研究了2天,终于明白JMock怎么用了。其实原理很简单,模拟测试。

我们在用spring做开发的时候,通常会分N层结构,比如web layer(struts), service(spring), DAO(ibatis)。开发是分层的,测试当然也分层。JMock的测试就是中间service层的测试。前提是保证DAO层,已经是OK的。(DAO层的测试我是用的spring-test做的,这个别的文章会说),JMock是帮你构造一个DAO的模拟对象,当你调用service代码时,service会调用Mock的对象,然后判断你调用的结果,是不是equal你模拟构造出的。

代码如下:
DTO数据模型:

  1. package com.dvs.biz.service.test;
  2. import org.apache.commons.lang.builder.ToStringBuilder;
  3. public class User {
  4. public User() {}
  5. public User(Integer id, String name) {
  6. this.id = id;
  7. this.name = name;
  8. }
  9. private Integer id;
  10. private String name;
  11. public Integer getId() {return id;}
  12. public void setId(Integer id) {this.id = id;}
  13. public String getName() {return name;}
  14. public void setName(String name) {this.name = name;}
  15. public String toString() {
  16. return ToStringBuilder.reflectionToString(this);
  17. }
  18. }

DAO 接口:

  1. package com.dvs.biz.service.test;
  2. public interface UserDAO {
  3. public User getUser(Integer id) throws Exception;
  4. }

DAO实现:



  1. package com.dvs.biz.service.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class UserDAOImpl implements UserDAO{
  5. public User getUser(Integer id) throws Exception {
  6. System.out.println("UserDAOImpl");
  7. // some code for "sql"
  8. // 这里可以随便写点什么,因为这个DAO层是MOCK做,不会真正调度这些代码
  9. return new User();
  10. }
  11. }

Service 接口:

  1. package com.dvs.biz.service.test;
  2. public interface UserServ {
  3. public User getUser(Integer id) throws Exception ;
  4. }

Service 的现实:

  1. package com.dvs.biz.service.test;
  2. public class UserServImpl implements UserServ{
  3. private UserDAO dao;
  4. public void setDAO(UserDAO dao) {
  5. this.dao = dao;
  6. }
  7. public User getUser(Integer id) throws Exception {
  8. System.out.println("UserBusinessDelegate");
  9. return dao.getUser(id);
  10. }
  11. }

JMock的测试类:




  1. package com.dvs.biz.service.test;
  2. import static org.junit.Assert.assertEquals;
  3. import org.jmock.Expectations;
  4. import org.jmock.Mockery;
  5. import org.jmock.integration.junit4.JMock;
  6. import org.jmock.integration.junit4.JUnit4Mockery;
  7. import org.junit.Test;
  8. import org.junit.runner.RunWith;
  9. @RunWith(JMock.class)
  10. public class UserServTest {
  11. Mockery context = new JUnit4Mockery();
  12. @Test
  13. public void getUser() throws Exception {
  14. final UserDAO dao = context.mock(UserDAO.class);
  15. UserServImpl ser = new UserServImpl();
  16. ser.setDAO(dao);
  17. final User testuser = new User();
  18. testuser.setId(2);
  19. testuser.setName("list2");
  20. context.checking(new Expectations() {
  21. {
  22. one(dao).getUser(1);
  23. will(returnValue(testuser));
  24. }
  25. });
  26. assertEquals(testuser,ser.getUser(1));
  27. context.assertIsSatisfied();
  28. }
  29. }

one(dao).getUser(1); //调用的dao的方法,和参数
will(returnValue(testuser)); //期待的返回值的结果

assertEquals(testuser,ser.getUser(1)); // 判断用ser调用的结果,是不是和dao返回的结果一样。

上面就是一个简短的小例子,我在这里的测试环境是jdk1.5.0,spring2.5, Junit4.4 , JMock2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值