距离上次做junit单体测试几个月,果然又用到了,又学习了一些新的东西,总结一下。

  1. 首先是对spy的理解,以前一直用mock,没有用过spy,所以对spy并不了解,最近用过几次后,也在google上学习了一下,网上说的都比较书面,mock:全部mock;spy:部分mock;但是到底什么叫全部,什么叫部分却始终没有能弄明白,自己实际使用后感觉,全部mock应该是对整个方法进行mock,不实际走方法,直接返回mock的返回值;而spy的部分mock应该是虽然mock了这个方法,并且返回了我们设置的mock值,但是实际上还是走被mock的方法的,如果这个方法里有错,一样会报异常,影响当前方法的测试。纯个人理解!!!有误导不负责!!!!!

  2. verify的使用,以前也没有用过这个东西,一般断言就够了,这次需要使用,了解了下他的作用,我知道的主要四个作用:①检证是否调用成功方法;②检证方法被调用的次数;③参数是否正确④检证超时。

  3. 在使用spy时y要注意一点;在进行mock时,开头不要使用when,而要用doReturn();

    e.g:PowerMockito.doReturn("1234").when(instance,"method",args);√

    e.g:PowerMockito.when(instance,"method",args).thenReturn("");×

  4. mock私有方法(public方法下调用private方法情况)(全部mock)

    ①以前的方法,使用Whitebox.invoke();

    ②PowerMockito.doCallRealMethod().when(instance).method();

      PowerMockito.DoReturn().when(instance,"method",args);

  5. mock私有方法(public方法下调用private方法情况)(部分mock)

    e.g:

    public class A(){


    public String b(int id){

       return c();

    }


    private String c(){

      return "abc"

    }}

    test:

    A a = new A();

    A aSpy = PowerMockito.spy(a);

    PowerMockito.doReturn("ccc").when(aSpy,"c",1);

    String retValue = aSpy.b(1);

    PowerMockito.VerifyPrivate(aSpy).invoke("c");

  6. mock静态方法

    ①@RunWith(PowerMockRunner.class)

      @PrepareForTest({staticClass.class})

      .......

      PowerMockito.Mock(staticClass.class);

      PowerMockito.when(staticClass.method(args)).thenReturn("123")  //造参数 Mockito.any()

  7. 检证静态方法verify

    PowerMocito.verifyStatic(MOckito.times(1));

    staticClass.method(args1,args2);

  8. Mock final类下的静态方法,操作和5是一样的。

  9. Suppress方法,略过测试的某行

    e.g:PowerMockito.suppress(PowerMockito.method(staticClass.class,"方法名",args1,...));

  10. 在不会以上两种mock私有方法的时候,大家一般用反射来实现,对私有方法的调用

    Method method = className.class.getDeclaredMethod("private method name");

    method.setAccessible(true) //设置可访问

  11. 在测试中出现的一个对象连续多次调用的情况如何mock

    e.g:有一个对象a,在类的入口处声明A a;使用注解或者spring配置之类的,下边有个b方法

    public void b(){

    a.getName().getId();

    }

    上边这种情况在mock的时候mock两次,分别mock

    PowerMockito.when(a.getName()).thenReturn(name);

    PowerMockito.when(a.getName().getId()).thenReturn(id);

    返回值name和id如果是自己直接new出来的,一般会出现类型错误,然后使用mock来创建就会解决这个问题了。

  12. 目前总结这些,遇到新问题,有新的收获后会继续增加。

  13. 最后推荐一个网站,我在这上边学了很多:http://javatechnology.net/java/mockito-spy/