单元测试

单元测试常用工具有:Mockito、powerMock、Hamcrest

 

下面分别对它们做个简单介绍

一、Mockito

 

1  Mockito是什么

Mockito是一种mock工具/框架。 它最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。

 

比如一段代码有这样的依赖:

当我们需要测试A类的时候,如果没有mock,则我们需要把整个依赖树都构建出来,而使用mock的话就可以将结构分解开,像下面这样:

2  Mockito的常用方法和使用

1)      模拟对象

mock(Class<T> classToMock) 

2)      模拟方法调用的返回值

when(T methodCall).thenReturn(T value)

3)      模拟方法调用抛出异常

ü  当模拟对象调用的方法返回类型为void

doThrow(Throwable toBeThrown).when(T mock).methodname();

ü  当模拟对象调用的方法有类型非void

when(T methodCall).thenThrow(Throwable... throwables); 

4)      参数匹配器,这意味着参数为任意值

anyBoolean()

anyByte()

anyChar()

anyInt()

anyLong()

anyFloat()

anyDouble()

anyShort()

anyObject()

any(Class<T> clazz)

anyString()

anyList()

5)      模拟方法调用次数

verify(T mock). methodname();

查看我们到底有没有调用过mock的这个方法,如果校验不通过将会抛出异常。

 

下面通过一个例子说明几个常用方法的使用

importstatic org.junit.Assert.*;

import java.util.LinkedList;

import java.util.List;

importstatic org.mockito.Mockito.*;

import org.junit.Test;

 

publicclass TestCase

{

    @Test

    publicvoid action()

    {

       //=================模拟对象================================

       LinkedList mockedLinkedList = mock(LinkedList.class);   

       

       //=================模拟方法调用的返回值=====================

       when(mockedLinkedList.get(0)).thenReturn("abc");

       assertEquals((String) mockedLinkedList.get(0), "abc");

         

       when(mockedLinkedList.get(0)).thenReturn("first")

.thenReturn("second");

       assertEquals((String) mockedLinkedList.get(0), "first");

       assertEquals((String) mockedLinkedList.get(0), "second");

       assertEquals((String) mockedLinkedList.get(0), "second");

       

       

       //==================模拟方法调用抛出异常====================

       

       //当模拟对象调用的方法返回值为void

       doThrow(new RuntimeException())

.when(mockedLinkedList).clear();

       

       boolean isException = false;

       try

        {

           mockedLinkedList.clear();

       }

       catch(Exception e)

       {

           isException = true;

       }

       assertTrue(isException);

       

       

       //当模拟对象调用的方法有返回值

       when(mockedLinkedList.getFirst())

.thenThrow(new RuntimeException());   

        

       isException = false;

       try

       {

           mockedLinkedList.getFirst();

       }

       catch(Exception e)

       {

           isException = true;

       }

       assertTrue(isException);

       

       //================匹配任何类型参数,这意味着参数为任意值===========

       // anyBoolean() anyByte() anyChar() anyInt() 

// anyLong() anyFloat() anyDouble()

      // anyShort() anyObject() any(Class<T> clazz) 

// anyString()anyList()

       when(mockedLinkedList.get(anyInt())).thenReturn("element");   

       assertEquals(mockedLinkedList.get(111), "element");

       assertEquals(mockedLinkedList.get(222), "element");

       

       when(mockedLinkedList.add(anyObject())).thenReturn(true);  

       assertTrue(mockedLinkedList.add(new String("11")));

       

       when(mockedLinkedList.lastIndexOf(any(String.class)))

.thenReturn(1);  

       assertEquals(mockedLinkedList.lastIndexOf(new String("aa")), 

1);

       

       //=================模拟方法调用次数================

       List mockedList = mock(List.class);   

       

       mockedList.add("once");  

       

       mockedList.add("twice");   

       mockedList.add("twice");   

         

       mockedList.add("three times");   

       mockedList.add("three times");   

       mockedList.add("three times"); 

       

       verify(mockedList).add("once");   

       verify(mockedList, times(1)).add("once");   

         

       //exact number of invocations verification   

       verify(mockedList, times(2)).add("twice");   

       verify(mockedList, times(3)).add("three times");   

         

       //verification using never(). never() is an alias to times(0)   

       verify(mockedList, never()).add("never happened");   

         

       //verification using atLeast()/atMost()   

       verify(mockedList, atLeastOnce()).add("three times");   

    }

}

 

 

3  maven中使用Mockito

配置pom.xml文件,引入mockito-all插件依赖,配置方法如下:

1)      配置mockito-all插件依赖

<dependencies>

    <dependency>

        <groupId>org.mockito</groupId>

        <artifactId>mockito-all</artifactId>

    </dependency>

  </dependencies>

2)      导入依赖包

<Import-Package>

      org.mockito.Mockito.*

  </Import-Package>

 

通过上面的配置就可以在bundle中使用Mockito工具写测试代码了。

 

 

二、PowerMock

PowerMock是一个扩展了其它如EasyMock等mock框架的、功能更加强大的框架。PowerMock使用一个自定义类加载器和字节码操作来模拟静态方法构造函数,final类和方法,私有方法去除静态初始化器等等。通过使用自定义的类加载器,简化采用的IDE或持续集成服务器不需要做任何改变。熟悉PowerMock支持的mock框架的开发人员会发现PowerMock很容易使用,因为对于静态方法和构造器来说,整个的期望API是一样的。PowerMock旨在用少量的方法和注解扩展现有的API来实现额外的功能。目前PowerMock支持EasyMock和Mockito。

 

三、Hamcrest

http://blog.sina.com.cn/s/blog_a449972001010h8j.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值