测试数据库时非常脆弱:数据的改变可能会影响测试的结果。
为目标的依赖创建桩(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:
- packagecn.partner4java.mock.dao;
- importcn.partner4java.mock.bean.Hello;
- publicinterfaceHelloDao {
- Hello getById(Long helloId);
- }
- packagecn.partner4java.mock.dao;
- importcn.partner4java.mock.bean.Hello;
- publicclassHelloDaoImplimplementsHelloDao {
- publicHello getById(Long helloId) {
- //这里面借助什么hibernate之类的,获取实体通过id
- returnnull;
- }
- }
Service:
- packagecn.partner4java.mock.service;
- importcn.partner4java.mock.bean.Hello;
- publicinterfaceHelloService {
- Hello findById(Long helloId);
- }
- packagecn.partner4java.mock.service;
- importcn.partner4java.mock.bean.Hello;
- importcn.partner4java.mock.dao.HelloDao;
- publicclassHelloServiceImplimplementsHelloService {
- privateHelloDao helloDao;
- publicvoidsetHelloDao(HelloDao helloDao) {
- this.helloDao = helloDao;
- }
- publicHello findById(Long helloId) {
- //还额外添加了一些业务逻辑的操作,那么,我们测试的就是这部分业务逻辑操作
- Hello hello = helloDao.getById(helloId);
- hello.setName(hello.getName() +" !");
- returnhello;
- }
- }
编写testcase:
- packagecn.partner4java.mock.test;
- importorg.jmock.Mock;
- importorg.jmock.MockObjectTestCase;
- importcn.partner4java.mock.bean.Hello;
- importcn.partner4java.mock.dao.HelloDao;
- importcn.partner4java.mock.service.HelloServiceImpl;
- publicclassHelloServiceImplTestextendsMockObjectTestCase{
- privateMock mock;
- privateHelloServiceImpl helloService;
- protectedvoidsetUp()throwsException {
- this.mock =newMock(HelloDao.class);
- helloService =newHelloServiceImpl();
- helloService.setHelloDao((HelloDao)this.mock.proxy());
- }
- publicvoidtestFindById() {
- Long id = 1L;
- Hello hello =newHello();
- 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桩对象的集合。