`
ydbc
  • 浏览: 711556 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

单元测试框架JMock与Mockito的用法比较

 
阅读更多

我们都有这种经验,测试在我们软件编码过程中占据了大部分时间,有时候觉得软件业务代码好写,但测试代码却难写了,单元测试是把自己的代码交托给测试同学和其他同学前的承诺。

为了获得更好的代码质量,我们一般都会用几好种工具,其中FindBugs和Emma(http://update.eclemma.org)就是常用的。

在测试与其它系统有交互的功能块,并且其它系统的稳定性未知的情况下,Mock就得派上用场了,否则测试起来极其吃力,并且效率低下。

下面简单介绍下两种Mock测试框架:JMock【http://www.jmock.org】和Mockito【http://www.mockito.org】。

一、前提说明

两个类:一个被Mock的对象(MayMockObject),一个被测试的对象(MainTstObject)。
很明显,我们的任务是测试MainTstObject,而该类引用了MayMockObject,为了测试的进行,我们模拟MayMockObject的实例。

测试用例类:MainTstObjectJMockTest和MainTstObjectMockitoTest。

二、依赖加入

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<scope>test</scope>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>jmock</groupId>
<artifactId>jmock</artifactId>
<scope>test</scope>
<version>2.5.1</version>
</dependency>

当然,如果工程不是基于Maven构架的,可以直接加入相应的Jar也行。

三、外接接口(将被Mock的对象)

public interface MayMockObject {
public String getString(String str);
}

四、功能类(被测试的类)

public class MainTstObject {
private MayMockObject mayMockObject; // 引用了外接接口

public String create(String str1, String str2) {
return str1 + this.mayMockObject.getString(str2);
}

public void setMayMockObject(MayMockObject mayMockObject) {
this.mayMockObject = mayMockObject;
}
}

五、JMock的测试用例

public class MainTstObjectJMockTest {
private Mockery context = new JUnit4Mockery();

private MayMockObject mayMockObject;
private MainTstObject mainTstObject;

@Before
public void setUp() {
this.mayMockObject = this.context.mock(MayMockObject.class); // Mock了外接接口

this.mainTstObject = new MainTstObject();
this.mainTstObject.setMayMockObject(this.mayMockObject);
}

@Test
public void process() {
final String str1 = "Mockito返回字符串。";
final String str2 = "Mockito返回字符串。";

this.context.checking(new Expectations() {
{
oneOf(mayMockObject).getString(str2);
will(returnValue("")); // Mock返回值

// allowing(mayMockObject).getString(with(any(String.class)));
// will(returnValue(""));
}
});

String ret = this.mainTstObject.create(str1, str2);
Assert.assertEquals(ret, str1);
}

@After
public void tearDown() {
}
}

六、Mockito的测试用例

public class MainTstObjectMockitoTest {
// 指定Mock的对象
@Mock
private MayMockObject mayMockObject;

private MainTstObject mainTstObject;

@Before
public void setUp() {
MockitoAnnotations.initMocks(this); // 声明测试用例类

this.mainTstObject = new MainTstObject();
this.mainTstObject.setMayMockObject(this.mayMockObject);
}

@Test
public void process() {
String str1 = "Mockito返回字符串。";
String str2 = "Mockito返回字符串。";

Mockito.when(this.mayMockObject.getString(str2)).thenReturn(""); // Mock返回值

String ret = this.mainTstObject.create(str1, str2);
Assert.assertEquals(ret, str1);
}

@After
public void tearDown(){
}
}

七、最后

从两个测试用例可以看出,JMock和Mockito在用法上的一些区别:

1、对于要Mock的对象,JMock要显示指出来【this.mayMockObject = this.context.mock(MayMockObject.class);】;
而Mockito只是简单加上注释【@Mock】,然后声明下测试用例类即可【MockitoAnnotations.initMocks(this);】。

2、对于方法的模拟,JMock显得更加复杂了【this.context.checking(new Expectations() {
{
oneOf(mayMockObject).getString(str2);
will(returnValue(""));
}
});】
而Mockito只要简单的一行代码就行【Mockito.when(this.mayMockObject.getString(str2)).thenReturn("");】。

从上可以看出,Mockito的代码行更少,更加简洁,个人比较喜欢用Mockito,简洁易记!

另外需要注意的是:JMock只能Mock接口,也就是上面的例子中【MayMockObject】只能为接口,不能为实体类;而Mockito就没有这个限制。
当然,我们既然用Mock,就是因为只知接口,而不知其具体实现,这样说来,JMock只能Mock接口不能算是Mockito的一个优点了。

分享到:
评论

相关推荐

    jmock-1.0.1-src.zip_单元测试

    不管是测试驱动开发或者是其它的开发模式,都会需要对代码进行单元测试,对于关联依赖关系少或者比较简单的类来说,直接使用JUnit就可以轻松的完成测试工作,但是对于关联到其它比较复杂的类或对运行环境有要求的类...

    Mockito一个采用Java编写用于单元测试的Mocking框架

    Mockito是一个针对Java的mocking框架。它与EasyMock和jMock很相似,但是通过在执行后校验什么已经被调用,它消除了对期望行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),...

    JMock单元测试

    介绍JMock单元测试的内容,内附简单的例子方便参考

    jMock基本使用方法

    详细介绍了Jmock的使用方法。如何编写自己的单元测试代码。

    Junit开源测试框架

    Junit开源测试框架 -Junit -Jmock -selenium -Apache JMeter

    jmock-2.5.1-javadoc

    jmock可以模拟对象,常用于单元测试,与junit配合使用 jmock-2.5.1-javadoc

    JUnit4 与 JMock 之双剑合璧.doc

    据统计,目前单元测试的框架中使用最多的是 JUnit,占 35% 以上的比重。下面要介绍的是 JUnit4,是 JUnit 最新的版本。JUnit4 使用了 Java 5 注解让测试的过程变得更方便和灵活,因此备受开发者的青睐。

    软件测试资料集合,jtest,jmock

    我所收集的所有单元测试资料,我所收集的所有单元测试资料,

    JMOCK-2.6.0

    用于项目测试,JMOCK,可以与JUNIT搭配进行测试

    jmock学习文档

    jmock学习文档,模拟对象技术,jMock 可以和既有的其他测试框架,如JUnit,很好地整合在一起,共同使用。

    jmock2.5.1和easymock3.0

    JMock2.5.1和EasyMock3.0以及一些JUnit单元测试所需的jar,让你使用JMock和EasyMock时不用到处找相关的jar。

    mockito-1.8.5

    Mockito是一个针对Java的mocking框架。它与EasyMock和jMock很相似,但是 通过在执行后校验什么已经被调用,它消除了对期望行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为 (expectations)...

    jmock-2.5.1-jars.zip

    jMock利用mock objects思想来对Java code进行测试。jMock具有以下特点:容易扩展,让你快速简单地定义mock objects,因此不必打破程序间的关联,让你定义灵活的超越对象之间交互作用而带来测试局限,减少你测试地脆弱...

    JMock 2.6.1所有源代码

    Mock测试主要是用来模拟那些在应用中不容易构造(如HttpServletRequest必须在Servlet容器中才能构造出来)或者比较复杂的对象(如JDBC中的ResultSet对象),从而使测试顺利进行...JMock是基于JAVA编写的Mock测试框架。

    jmock2.5.1.zip

    jmock2.5.1.zip

    JMOCK 2.6.0-RC2

    jMock 2: Java 5 and above. Stable: 2.5.1 Binary JARs (includes the source to let IDEs provide context-sensitive help) Javadocs Unstable: 2.6.0-RC2 Binary JARs (includes the source to let IDEs ...

    Jmock2.6 jar包

    Jmock2.6 jar包

    jmock-2.6.0-jars

    jmock jar和源码

    jmock-1.2.0.jar

    Maven-Central / jmock / jmock-cglib 1.2.0 Maven-Central / org.apache.activemq / activemq-ra 5.2.05.1.0 Maven-Central / org.apache.maven.shared / maven-dependency-tree 1.21.1 Maven-Central / org.apache...

Global site tag (gtag.js) - Google Analytics