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数据模型:
- package com.dvs.biz.service.test;
- import org.apache.commons.lang.builder.ToStringBuilder;
- public class User {
- public User() {}
- public User(Integer id, String name) {
- this.id = id;
- this.name = name;
- }
- private Integer id;
- private String name;
- public Integer getId() {return id;}
- public void setId(Integer id) {this.id = id;}
- public String getName() {return name;}
- public void setName(String name) {this.name = name;}
- public String toString() {
- return ToStringBuilder.reflectionToString(this);
- }
- }
DAO 接口:
- package com.dvs.biz.service.test;
- public interface UserDAO {
- public User getUser(Integer id) throws Exception;
- }
DAO实现:
- package com.dvs.biz.service.test;
- import java.util.ArrayList;
- import java.util.List;
- public class UserDAOImpl implements UserDAO{
- public User getUser(Integer id) throws Exception {
- System.out.println("UserDAOImpl");
- // some code for "sql"
- // 这里可以随便写点什么,因为这个DAO层是MOCK做,不会真正调度这些代码
- return new User();
- }
- }
Service 接口:
- package com.dvs.biz.service.test;
- public interface UserServ {
- public User getUser(Integer id) throws Exception ;
- }
Service 的现实:
- package com.dvs.biz.service.test;
- public class UserServImpl implements UserServ{
- private UserDAO dao;
- public void setDAO(UserDAO dao) {
- this.dao = dao;
- }
- public User getUser(Integer id) throws Exception {
- System.out.println("UserBusinessDelegate");
- return dao.getUser(id);
- }
- }
JMock的测试类:
- package com.dvs.biz.service.test;
- import static org.junit.Assert.assertEquals;
- import org.jmock.Expectations;
- import org.jmock.Mockery;
- import org.jmock.integration.junit4.JMock;
- import org.jmock.integration.junit4.JUnit4Mockery;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- @RunWith(JMock.class)
- public class UserServTest {
- Mockery context = new JUnit4Mockery();
- @Test
- public void getUser() throws Exception {
- final UserDAO dao = context.mock(UserDAO.class);
- UserServImpl ser = new UserServImpl();
- ser.setDAO(dao);
- final User testuser = new User();
- testuser.setId(2);
- testuser.setName("list2");
- context.checking(new Expectations() {
- {
- one(dao).getUser(1);
- will(returnValue(testuser));
- }
- });
- assertEquals(testuser,ser.getUser(1));
- context.assertIsSatisfied();
- }
- }
one(dao).getUser(1); //调用的dao的方法,和参数
will(returnValue(testuser)); //期待的返回值的结果
assertEquals(testuser,ser.getUser(1)); // 判断用ser调用的结果,是不是和dao返回的结果一样。
上面就是一个简短的小例子,我在这里的测试环境是jdk1.5.0,spring2.5, Junit4.4 , JMock2