Mockito模拟无效方法
时间:2020-02-23 14:40:45 来源:igfitidea点击:
大多数时候,Mockito的" when()"方法足以模拟对象的行为。
但是,当我们必须模拟void方法时,就不能使用when()
。
Mockito模拟无效方法
Mockito提供了以下可用于模拟void方法的方法。
doAnswer()
:当被调用的模拟对象方法返回void时,我们可以使用它执行一些操作。doThrow()
:当我们想存根一个抛出异常的void方法时,可以使用doThrow()。
让我们创建一个带有void方法的简单类,该类将在测试类中进行模拟。
package com.theitroad; public class Employee { private String name; public String getName() { return name; } public void setName(String name) { if (name == null) throw new IllegalArgumentException("Employee Name can't be null"); this.name = name; } }
Mockito模拟无效方法示例
Mockito doAnswer()方法将" Answer"作为参数。
这是一个功能性的接口,因此我们可以使用lambda表达式进行实现。
doAnswer((i) -> { System.out.println("Employee setName Argument = " + i.getArgument(0)); assertTrue("hyman".equals(i.getArgument(0))); return null; }).when(emp).setName(anyString());
注意,因为我们在模拟void方法,所以需要return null
语句。
Mockito模拟无效方法与异常
下面的代码片段显示了如何使用doThrow()方法来模拟带有异常的void方法。
doThrow(IllegalArgumentException.class).when(emp).setName(null);
JUnit Mockito模拟void方法示例
这是我使用Mockito模拟void方法的JUnit中的完整示例。
package com.theitroad.mockito.voidmethod; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.jupiter.api.Test; import com.theitroad.Employee; class JUnitMockitoVoidMethod { @Test void test_mockito_void() { Employee emp = mock(Employee.class); doThrow(IllegalArgumentException.class).when(emp).setName(null); doAnswer((i) -> { System.out.println("Employee setName Argument = " + i.getArgument(0)); assertTrue("hyman".equals(i.getArgument(0))); return null; }).when(emp).setName(anyString()); when(emp.getName()).thenReturn("hyman"); assertThrows(IllegalArgumentException.class, () -> emp.setName(null)); emp.setName("hyman"); assertEquals("hyman", emp.getName()); } }
TestNG Mockito无效方法示例
由于JUnit 5和TestNG批注是如此相似,因此我们无需在上述类中进行任何代码特定的更改即可从JUnit 5切换到TestNG。
只需删除JUnit 5导入语句并添加以下导入即可将测试框架从JUnit更改为TestNG。
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertThrows; import static org.testng.Assert.assertTrue; import org.testng.annotations.Test;