Overblog Tous les blogs Top blogs Technologie & Science Tous les blogs Technologie & Science
Editer l'article Suivre ce blog Administration + Créer mon blog
MENU

UnitTest Gmock

24 Juillet 2013 Publié dans #java, #unittest

Unit test 是工作中新学到的东西,非常有必要,保证每个单元程序正常运行。其中Mockito是很好用的。

一、什么是mock测试,什么是mock对象?

先来看看下面这个示例:

Publicité
UnitTest Gmock

从上图可以看出如果我们要对A进行测试,那么就要先把整个依赖树构建出来,也就是BCDE的实例。

一种替代方案就是使用mocks

UnitTest Gmock
Publicité

从图中可以清晰的看出

mock对象就是在调试期间用来作为真实对象的替代品。

mock测试就是在测试过程中,对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。

二、什么是Mockito

除了有一个好记的名字外,Mockito尝试用不一样的方法做mocking测试,是简单轻量级能够替代EasyMock的框架。使用简单,测试代码可读性高,丰富的文档包含在javadoc中,直接在IDE中可查看文档,实例,说明。更多信息:http://code.google.com/p/mockito/

mockito入门实例

Maven依赖:(没用maven管理的可以下载相关jar包导入classpath)

三、mockito入门实例

Xml代码

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mockito</groupId>
  4. <artifactId>mockito-all</artifactId>
  5. <version>1.8.5</version>
  6. <scope>test</scope>
  7. </dependency>
  8. </dependencies>

Java代码

  1. import static org.mockito.Mockito.*;
  2. import java.util.List;
  3. import org.junit.Assert;
  4. import org.junit.Test;
  5. /**
  6. *
  7. * @author lzjun
  8. * @version 0.1
  9. * @date 2012-5-5
  10. * {@link http://weibo.com/u/1697702241}
  11. *
  12. */
  13. public class SimpleTest {
  14. @Test
  15. public void simpleTest(){
  16. //创建mock对象,参数可以是类,也可以是接口
  17. List<String> list = mock(List.class);
  18. //设置方法的预期返回值
  19. when(list.get(0)).thenReturn("helloworld");
  20. String result = list.get(0);
  21. //验证方法调用(是否调用了get(0))
  22. verify(list).get(0);
  23. //junit测试
  24. Assert.assertEquals("helloworld", result);
  25. }
  26. }

创建mock对象不能对final,Anonymous ,primitive类进行mock。

可对方法设定返回异常

Java代码

  1. when(list.get(1)).thenThrow(new RuntimeException("test excpetion"));

stubbing另一种语法(设置预期值的方法),可读性不如前者

Java代码

  1. doReturn("secondhello").when(list).get(1);

没有返回值的void方法与其设定(支持迭代风格,第一次调用donothing,第二次dothrow抛出runtime异常)

Java代码

  1. doNothing().doThrow(new RuntimeException("void exception")).when(list).clear();
  2. list.clear();
  3. list.clear();
  4. verify(list,times(2)).clear();

四、参数匹配器(Argument Matcher)

Matchers类内加你有很多参数匹配器 anyInt、anyString、anyMap.....Mockito类继承于Matchers,Stubbing时使用内建参数匹配器,下例:

Java代码

  1. @Test
  2. public void argumentMatcherTest(){
  3. List<String> list = mock(List.class);
  4. when(list.get(anyInt())).thenReturn("hello","world");
  5. String result = list.get(0)+list.get(1);
  6. verify(list,times(2)).get(anyInt());
  7. Assert.assertEquals("helloworld", result);
  8. }

需要注意的是:如果使用参数匹配器,那么所有的参数都要使用参数匹配器,不管是stubbing还是verify的时候都一样。

Java代码

  1. @Test
  2. public void argumentMatcherTest2(){
  3. Map<Integer,String> map = mock(Map.class);
  4. when(map.put(anyInt(),anyString())).thenReturn("hello");//anyString()替换成"hello"就会报错
  5. map.put(1, "world");
  6. verify(map).put(eq(1), eq("world")); //eq("world")替换成"world"也会报错
  7. }

五、方法调用的验证(具体的调用次数、至少一次,一次也没有)

Java代码

  1. @Test
  2. public void verifyInvocate(){
  3. List<String> mockedList = mock(List.class);
  4. //using mock
  5. mockedList.add("once");
  6. mockedList.add("twice");
  7. mockedList.add("twice");
  8. mockedList.add("three times");
  9. mockedList.add("three times");
  10. mockedList.add("three times");
  11. /**
  12. * 基本的验证方法
  13. * verify方法验证mock对象是否有没有调用mockedList.add("once")方法
  14. * 不关心其是否有返回值,如果没有调用测试失败。
  15. */
  16. verify(mockedList).add("once");
  17. verify(mockedList, times(1)).add("once");//默认调用一次,times(1)可以省略
  18. verify(mockedList, times(2)).add("twice");
  19. verify(mockedList, times(3)).add("three times");
  20. //never()等同于time(0),一次也没有调用
  21. verify(mockedList, times(0)).add("never happened");
  22. //atLeastOnece/atLeast()/atMost()
  23. verify(mockedList, atLeastOnce()).add("three times");
  24. verify(mockedList, atLeast(2)).add("twice");
  25. verify(mockedList, atMost(5)).add("three times");
  26. }

Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article