简单示例mock的使用 (Junit结合Jmock)
2011-11-28 13:48
996 查看
测试数据库时非常脆弱:数据的改变可能会影响测试的结果。
为目标的依赖创建桩(stub)或mock类是更好的解决方案。
可以使用jMock开源库来快速、简单的定义mock对象。(详细请查看:http://www.jmock.org)
stub:通常指的是目标接口的简单实现,他通常只响应对应的测试中的调用,起作用是为被测试的类创建必要的输入。
mock:是实际的实现对象,被测试的类会使用到他。
demo:利用Jmock
被mock的dao:
view
plaincopy
to clipboardprint?
package cn.partner4java.mock.dao;
import cn.partner4java.mock.bean.Hello;
public interface HelloDao
{
Hello
getById(Long helloId);
}
view
plaincopy
to clipboardprint?
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:
view
plaincopy
to clipboardprint?
package cn.partner4java.mock.service;
import cn.partner4java.mock.bean.Hello;
public interface HelloService
{
Hello
findById(Long helloId);
}
view
plaincopy
to clipboardprint?
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:
view
plaincopy
to clipboardprint?
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桩对象的集合。
为目标的依赖创建桩(stub)或mock类是更好的解决方案。
可以使用jMock开源库来快速、简单的定义mock对象。(详细请查看:http://www.jmock.org)
stub:通常指的是目标接口的简单实现,他通常只响应对应的测试中的调用,起作用是为被测试的类创建必要的输入。
mock:是实际的实现对象,被测试的类会使用到他。
demo:利用Jmock
被mock的dao:
view
plaincopy
to clipboardprint?
package cn.partner4java.mock.dao;
import cn.partner4java.mock.bean.Hello;
public interface HelloDao
{
Hello
getById(Long helloId);
}
view
plaincopy
to clipboardprint?
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:
view
plaincopy
to clipboardprint?
package cn.partner4java.mock.service;
import cn.partner4java.mock.bean.Hello;
public interface HelloService
{
Hello
findById(Long helloId);
}
view
plaincopy
to clipboardprint?
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:
view
plaincopy
to clipboardprint?
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桩对象的集合。
相关文章推荐
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- 单元测试及框架简介 --junit、jmock、mockito、powermock的简单使用
- junit与testng 分别和mockito 结合使用例子
- Maven简单的配置Junit测试及使用简单的mock
- Junit 简单示例(使用TestSuite)
- flex 整合 struts 的一个简单示例(使用Httpservice)
- Java API中Array类简单使用示例
- js使用Replace结合正则替换重复出现的字符串功能示例
- 使用annotations注解的hibernate的简单示例
- 最简单的视音频播放示例6:OpenGL播放YUV420P(通过Texture,使用Shader)
- springMVC和Shiro框架整合使用简单示例 【转】
- android 使用URL读取网络图片简单示例
- ASP.NET报表简单使用示例
- SQLSERVER 游标使用简单示例
- Junit的简单使用
- 【mockito】单元测试之mockito简单使用
- Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程
- 使用vue + less 实现简单换肤功能的示例
- Python中使用插入排序算法的简单分析与代码示例
- 使用Quartz2.1.6+Spring3.0实现任务调度简单示例