测试数据库时非常脆弱:数据的改变可能会影响测试的结果。
为目标的依赖创建桩(stub)或mock类是更好的解决方案。
可以使用jMock开源库来快速、简单的定义mock对象。(详细请查看:http://www.jmock.org)
stub:通常指的是目标接口的简单实现,他通常只响应对应的测试中的调用,起作用是为被测试的类创建必要的输入。
mock:是实际的实现对象,被测试的类会使用到他。
demo:利用Jmock
被mock的dao:
Service:
编写testcase:
对web层进行单元测试
Spring在包org.springframework.mock.web中为Web应用所使用的接口提供了方便的桩实现。这个包具备了Servlet API桩对象的集合。
为目标的依赖创建桩(stub)或mock类是更好的解决方案。
可以使用jMock开源库来快速、简单的定义mock对象。(详细请查看:http://www.jmock.org)
stub:通常指的是目标接口的简单实现,他通常只响应对应的测试中的调用,起作用是为被测试的类创建必要的输入。
mock:是实际的实现对象,被测试的类会使用到他。
demo:利用Jmock
被mock的dao:
- package cn.partner4java.mock.dao;
- import cn.partner4java.mock.bean.Hello;
- public interface HelloDao {
- Hello getById(Long helloId);
- }
- package cn.partner4java.mock.dao;
- import cn.partner4java.mock.bean.Hello;
- public class HelloDaoImpl implements HelloDao {
- public Hello getById(Long helloId) {
- //这里面借助什么hibernate之类的,获取实体通过id
- return null;
- }
- }
Service:
- package cn.partner4java.mock.service;
- import cn.partner4java.mock.bean.Hello;
- public interface HelloService {
- Hello findById(Long helloId);
- }
- package cn.partner4java.mock.service;
- import cn.partner4java.mock.bean.Hello;
- import cn.partner4java.mock.dao.HelloDao;
- public class HelloServiceImpl implements HelloService {
- private HelloDao helloDao;
- public void setHelloDao(HelloDao helloDao) {
- this.helloDao = helloDao;
- }
- public Hello findById(Long helloId) {
- //还额外添加了一些业务逻辑的操作,那么,我们测试的就是这部分业务逻辑操作
- Hello hello = helloDao.getById(helloId);
- hello.setName(hello.getName() + " !");
- return hello;
- }
- }
编写testcase:
- package cn.partner4java.mock.test;
- import org.jmock.Mock;
- import org.jmock.MockObjectTestCase;
- import cn.partner4java.mock.bean.Hello;
- import cn.partner4java.mock.dao.HelloDao;
- import cn.partner4java.mock.service.HelloServiceImpl;
- public class HelloServiceImplTest extends MockObjectTestCase{
- private Mock mock;
- private HelloServiceImpl helloService;
- protected void setUp() throws Exception {
- this.mock = new Mock(HelloDao.class);
- helloService = new HelloServiceImpl();
- helloService.setHelloDao((HelloDao)this.mock.proxy());
- }
- public void testFindById() {
- Long id = 1L;
- Hello hello = new Hello();
- hello.setId(id);
- hello.setName("HelloWorld");
- this.mock.expects(once()).method("getById").with(eq(id)).will(returnValue(hello));
- Hello helloS = this.helloService.findById(id);
- System.out.println(helloS);
- }
- }
对web层进行单元测试
Spring在包org.springframework.mock.web中为Web应用所使用的接口提供了方便的桩实现。这个包具备了Servlet API桩对象的集合。