Метод Mockito Mock Void
В большинстве случаев метод Mockito when()
достаточно хорош, чтобы имитировать поведение объекта. Но когда нам нужно имитировать метод void, мы не можем использовать when()
.
Метод Mockito Mock Void
Mockito предоставляет следующие методы, которые можно использовать для имитации методов void.
doAnswer()
: мы можем использовать это для выполнения некоторых операций, когда вызывается метод фиктивного объекта, возвращающий void.doThrow()
: мы можем использовать doThrow(), когда хотим заглушить метод 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() принимает Answer
в качестве аргумента. Это лямбда-выражение для его реализации.
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 mock void с исключением
Ниже фрагмент кода показывает, как использовать метод doThrow() для имитации методов void с исключением.
doThrow(IllegalArgumentException.class).when(emp).setName(null);
Пример метода имитации пустоты JUnit Mockito
Вот полный пример в 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;
Вы можете загрузить полный код проекта из нашего репозитория GitHub.