Автор оригинала: Pankaj Kumar.
В большинстве случаев метод Mockito when() достаточно хорош, чтобы издеваться над поведением объекта. Но когда нам приходится издеваться над методом void, мы не можем использовать when() .
Метод Mockito Имитация Пустоты
Mockito предоставляет следующие методы, которые можно использовать для моделирования методов void.
do Answer(): Мы можем использовать это для выполнения некоторых операций, когда вызывается метод издевательского объекта, возвращающий значение void.do Throw(): Мы можем использовать do Throw (), когда хотим заглушить метод void, который создает исключение.
Давайте создадим простой класс с методом void, который мы будем использовать в наших тестовых классах.
package com.journaldev;
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 mock void
Метод Mockito doAnswer() принимает Ответ в качестве аргумента. Это функциональный интерфейс , поэтому мы можем использовать лямбда-выражение для его реализации.
doAnswer((i) -> {
System.out.println("Employee setName Argument = " + i.getArgument(0));
assertTrue("Pankaj".equals(i.getArgument(0)));
return null;
}).when(emp).setName(anyString());
Обратите внимание, что оператор return null требуется, так как мы издеваемся над методом void.
Метод Mockito имитация пустоты с исключением
Ниже фрагмент кода показывает, как использовать метод do Throw() для моделирования методов void с исключением.
doThrow(IllegalArgumentException.class).when(emp).setName(null);
Пример метода JUnit Mockito mock void
Вот полный пример в JUnit, где я использую Mockito, чтобы имитировать метод void.
package com.journaldev.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.journaldev.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("Pankaj".equals(i.getArgument(0)));
return null;
}).when(emp).setName(anyString());
when(emp.getName()).thenReturn("Pankaj");
assertThrows(IllegalArgumentException.class, () -> emp.setName(null));
emp.setName("Pankaj");
assertEquals("Pankaj", emp.getName());
}
}
Пример метода TestNG Mockito void
Поскольку аннотации 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;