Как смоделировать новый экземпляр, где он возвращает ссылку на интерфейс - PullRequest
0 голосов
/ 01 мая 2018

У меня есть такой сценарий

MyInterface myObject = new MyInterfaceImplementedClass();
myObject.get(...)

Я хочу издеваться над классом MyInterfaceImplementedClass, я пробовал, как показано ниже

private MyInterface mockMyObject
private MyInterfaceImplementedClass mockMyClassObject

// the below compilation error 
whenNew(MyInterfaceImplementedClass.class).withNoArguments().thenReturn(mockMyObject);
// no compilation error but not giving mocking instance at runtime
whenNew(MyInterfaceImplementedClass.class).withNoArguments().thenReturn(mockMyClassObject);

Пожалуйста, помогите мне в этом

1 Ответ

0 голосов
/ 04 мая 2018

Решено в комментариях:

после добавления моего тестового класса в сторону @PrepareForTest, он работает как положено

Короче говоря, Mockito записывает сгенерированный подкласс для класса, который вы пытаетесь смоделировать, что позволяет ему перехватывать поведение переопределяемых методов (то есть неконечный метод экземпляра). Это обрабатывает все интерфейсы и большинство абстрактных и конкретных классов. Однако, если вы пытаетесь смоделировать поведение методов final или static, включая конструкторы, Mockito ничего не сможет сделать 1 : класс потребления содержит ссылку на точную реальную реализацию без поиск в таблице виртуальных методов. Единственный выход - это переписать и заменить байт-код существующего класса , что и делает PowerMock.

Часто он может просто перезаписать класс, который вы пытаетесь смоделировать, но при определенных обстоятельствах вам нужно перечислить тестируемый класс или сам тестовый класс.

Следовательно, почти во всех тестах, которые используют функции PowerMock, требуется @PrepareForTest, а также оператор @RunWith, который гарантирует, что тестовый класс использует загрузчик классов PowerMock для включения этой перезаписи.


1 начиная с Mockito 2.1, Mockito может использовать инструментальные загрузчики классов для выполнения некоторых вещей, которые ранее были доступны только в PowerMock.

...