Автор оригинала: 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;