Начиная с Mockito 2.x, Mockito теперь поддерживает насмешку над финальными классами и методами.
Пример:
Скажем, у нас есть класс MyList
, показанный ниже как соавтор в тестовых случаях.
Мы добавим новый finalMethod
в этот класс:
public class MyList extends AbstractList {
final public int finalMethod() {
return 0;
}
}
И мы также расширим его конечным подклассом:
public final class FinalList extends MyList {
@Override
public int size() {
return 1;
}
}
Прежде чем Mockito можно будет использовать для моделирования конечных классов и методов, его необходимо настроить.
Нам нужно добавить текстовый файл в каталог проекта src / test / resources / mockito-extensions с именем org.mockito.plugins.MockMaker и добавить одну строку текста:
mock -maker-inline
Mockito проверяет каталог расширений на наличие файлов конфигурации при его загрузке. Этот файл включает макетирование финальных методов и классов.
Макет финального метода:
Как только Mockito правильно настроен, финальный метод может быть симулирован как любой другой:
@Test
public void whenMockFinalMethodMockWorks() {
MyList myList = new MyList();
MyList mock = mock(MyList.class);
when(mock.finalMethod()).thenReturn(1);
assertNotEquals(mock.finalMethod(), myList.finalMethod());
}
Создав конкретный экземпляр и макетный экземпляр MyList, мы можем сравнить значения, возвращаемые обеими версиями finalMethod()
, и убедиться, что макет вызывается.
Макет финального класса:
Насмешка над финальным классом так же проста, как и над любым другим классом:
@Test
public void whenMockFinalClassMockWorks() {
FinalList finalList = new FinalList();
FinalList mock = mock(FinalList.class);
when(mock.size()).thenReturn(2);
assertNotEquals(mock.size(), finalList.size());
}
Подобно тесту выше, мы создаем конкретный экземпляр и макет экземпляра нашего последнего класса, макет метода и убедитесь, что макет экземпляра ведет себя по-разному.
Ссылка: https://www.baeldung.com/mockito-final