用Mockito来mock返回值类型为void的方法

简介: 开发中有些依赖的接口还没有开发完成、有些接口还调不通等情况,可以使用Mockito对接口进行mock,然后去测试逻辑,非常好用。最近开发中用到对void返回值类型的方法Mock,看到一篇不错的文章,翻译出来,希望对大家有帮助。-------------------------------------------------------华丽的分割线-------------------------------------------------------

1、概述

本文的主要内容是用Mockito来mock无返回值的方法。

下面是为测试准备的类

1. public class MyList extends AbstractList<String> {
2. 
3. @Override
4. public void add(int index, String element) {
5. // no-op
6.     }
7. }

2、简单mock和验证

可以用 Mockito的doNothing()、doThrow()和doAnswer() 来对无返回值的函数进行Mock和验证。

1. @Test
2. public void whenAddCalledVerfied() {
3. MyList myList = mock(MyList.class);
4.     doNothing().when(myList).add(isA(Integer.class), isA(String.class));
5.     myList.add(0, "");
6. 
7.     verify(myList, times(1)).add(0, "");
8. }

然而在Mockito中doNothing()是对无返回值的方法mock的默认行为。

下面代码和上面的等价

1. @Test
2. public void whenAddCalledVerfied() {
3. MyList myList = mock(MyList.class);
4.     myList(0, "");
5. 
6.     verify(myList, times(1)).add(0, "");
7. }

DoThrow() 则会产生异常

1. @Test(expected = Exception.class)
2. public void givenNull_AddThrows() {
3. MyList myList = mock(MyList.class);
4.     doThrow().when(myList).add(isA(Integer.class), isNull());
5. 
6.     myList.add(0, null);
7. }

下面将介绍doAnswer()

3、参数获取

重写doNothing() 这个默认行为的一个重要原因是获取参数。

正如第二部分的例子,通过verify() 验证了参数传给了add()函数。

那么,如果我们需要获取参数来干点其他事情该怎么做呢?

依然还需要用doNothing() ,只不过要用到ArgumentCaptor。

1. @Test
2. public void whenAddCalledValueCaptured() {
3. MyList myList = mock(MyList.class);
4. ArgumentCaptor valueCapture = ArgumentCaptor.forClass(String.class);
5.     doNothing().when(myList).add(any(Integer.class), valueCapture.capture());
6.     myList.add(0, "captured");
7. 
8.     assertEquals("captured", valueCapture.getValue());
9. }

 

4、对void返回类型的方法构造answer

方法可能不仅仅只是添加一个值那么简单。这时就需要用到 Answer 类来添加我们需要的其他行为。

1. @Test
2. public void whenAddCalledAnswered() {
3. MyList myList = mock(MyList.class);
4.     doAnswer((Answer) invocation -> {
5. Object arg0 = invocation.getArgument(0);
6. Object arg1 = invocation.getArgument(1);
7. 
8.         assertEquals(3, arg0);
9.         assertEquals("answer me", arg1);
10. return null;
11.     }).when(myList).add(any(Integer.class), any(String.class));
12.     myList.add(3, "answer me");

这里也支持使用lambda表达式。

5、部分mock

 

Mockito的doCallRealMethod() 方法可以用在void函数上。

1. @Test
2. public void whenAddCalledRealMethodCalled() {
3. MyList myList = mock(MyList.class);
4.     doCallRealMethod().when(myList).add(any(Integer.class), any(String.class));
5.     myList.add(1, "real");
6. 
7.     verify(myList, times(1)).add(1, "real");
8. }

这个函数允许我们调用原始对象的实际方法同时也允许我们去调用验证。

6、结论

本文介绍了Mockito中四种对void返回值的函数进行Mock的方法。

 

英文原文:https://www.baeldung.com/mockito-void-methods

源代码:https://github.com/eugenp/tutorials/tree/master/testing-modules/mockito

相关文章
|
3月前
|
Java
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
本文探讨了在Java中,当父类的方法返回`this`对象或变量时,子类调用该方法的行为,以及`this`关键字在不同类中调用方法时的指向问题。
23 0
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
|
7月前
|
JSON Java 数据格式
controller方法的返回值
controller方法的返回值
Java-----抽象类为什么不能实例化?抽象方法为什么不能被static修饰?set和get方法的使用方法
Java-----抽象类为什么不能实例化?抽象方法为什么不能被static修饰?set和get方法的使用方法
135 0
|
8月前
|
传感器 安全 编译器
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
【C++断言机制】深入理解C/C++ 中静态断言static_assert与断言 assert
177 0
|
8月前
|
存储 算法 编译器
【C++ 关键字 static_assert 相关问题】C++ 关于静态断言的编译问题 ,深入了解静态断言
【C++ 关键字 static_assert 相关问题】C++ 关于静态断言的编译问题 ,深入了解静态断言
144 0
|
8月前
|
编译器
C++11 静态断言(static_assert)的介绍:介绍静态断言(static assert)在C++11 中的作用和使用方法
C++11 静态断言(static_assert)的介绍:介绍静态断言(static assert)在C++11 中的作用和使用方法
56 0
|
JSON 前端开发 Java
SpringMVC 方法三种类型返回值总结,你用过几种?
SpringMVC 方法三种类型返回值总结,你用过几种?
Java基础方法返回值类型是void的情况
Java基础方法返回值类型是void的情况
|
JSON 前端开发 数据格式
SpringMVC——控制器方法的返回值类型(ModelAndView、String、void、Object)
SpringMVC——控制器方法的返回值类型(ModelAndView、String、void、Object)
SpringMVC——控制器方法的返回值类型(ModelAndView、String、void、Object)
重写toString()这个来自Object类的方法的意义
重写toString()这个来自Object类的方法的意义
138 0