Mockito

Mockito

起男 623 2020-07-10

Mockito

注:以下测试案例已进行静态导入

import static org.mockito.Mockito.*;

verify

  • verify可以验证被mock的对象释放进行了相应的操作
  • 如果未进行相应的操作就会抛出异常
@Test
    void verifyTest() {
        //被验证的对象需要被mock
        List list = mock(List.class);
        list.add("abc");
        list.clear();

        //校验是否进行指定操作
        verify(list).add("abc");
        //如果没有则抛出异常
        //verify(list).add("def");
        verify(list).clear();
    }

调用次数校验

@Test
    void verifyTest(){
        list.add("aaa");
        list.add("bbb");
        list.add("bbb");
        list.add("ccc");
        list.add("ccc");
        list.add("ccc");

        //是否调用过
        verify(list).add("aaa");
        //是否调用过2次
        verify(list,times(2)).add("bbb");
        //是否调用过3次
        verify(list,times(3)).add("ccc");

        //是否没有调用过
        verify(list,never()).add("ddd");

        //是否至少被调用过一次
        verify(list,atLeastOnce()).add("aaa");
        //是否至少调用过2次
        verify(list,atLeast(2)).add("bbb");
        //是否最多调用过3次
        verify(list,atMost(3)).add("ccc");
    }
  • times:验证方法是否调用指定次数
  • never:验证方法没有被调用过
  • atLeastOnce:验证方法至少被调用过一次
  • atLeast:验证方法至少执行过指定次数
  • atMost:验证方法最多执行过指定次数

thenReturn

	@Test
    void returnTest(){
        when(list.get(anyInt()))
                .thenReturn("aaa")
                .thenReturn("bbb");
        //效果与上面相同
        //when(list.get(anyInt())).thenReturn("aaa","bbb");
        System.out.println(list.get(1///aaa
        System.out.println(list.get(2));//bbb
        System.out.println(list.get(3));//bbb
        System.out.println(list.get(4));//bbb
    }
  • 为指定操作设置多个结果
  • 当返回值进行到最后一个时,无论再调用多少次都只会返回最后一个结果

when

  • when可以对被mock的对象的相应操作配置相应的结果
  • 调用时如果设置结果则返回设置的结果,如果没有则返回默认值
@Test
    void whenTest(){
        List list = mock(List.class);

        //设置对应操作的结果
        when(list.get(0)).thenReturn("abc");
        when(list.get(1)).thenThrow(new RuntimeException("发生异常"));

        //返回abc
        System.out.println(list.get(0));

        //发生异常
        System.out.println(list.get(1));

        //返回null 不会报错
        System.out.println(list.get(999));
    }
  • when无法作用域无返回值的方法

  • 此时可以通过do...()的方法,进行辅助

@Test
    void doTest(){
        //设置list的key必须是int类型,value必须是string类型
        doNothing().when(list).add(anyInt(),any());
        //当调用list的clear方法时抛出异常
        doThrow(new RuntimeException("发生异常")).when(list).clear();
        
        list.add(1,"abc");
        list.clear();
    }

@Mock

  • 可以使用@Mock注解mock指定的对象
  • 注意:在测试类中需要进行初始化
	@Mock
    private List list;

    @BeforeEach
    void before(){
        MockitoAnnotations.initMocks(this);
    }

@spy

  • 和mock类似,但对于未指定mock的方法,spy默认会调用真实方法,有返回值的返回真实返回值,mock默认不执行,有返回值的返回null
	@Spy
    private List list;

    @BeforeEach
    void before(){
        MockitoAnnotations.initMocks(this);
    }

any

  • 可以使用any()匹配所有参数
  • 也可以使用如anyInt()、anyString()等方法匹配指定类型参数
@Test
    void anyTest(){
        //匹配所有int类型
        when(list.get(anyInt())).thenReturn("abc");

        //get任何数值都会返回abc
        System.out.println(list.get(0));
        System.out.println(list.get(1));   
    }