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

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

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);

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

Что означает "но не выдавать насмешливый экземпляр во время выполнения ""?

luk2302 01.05.2018 18:58

При использовании PowerMockito критически важно, чтобы мы видели ваши аннотации @RunWith и @PrepareForTest в тестовом классе. Пожалуйста, отредактируйте свой вопрос, чтобы включить их. (PowerMock управляет загрузчиком классов Java, поэтому эти аннотации часто являются разницей между неудачей и успехом.) Если вы не используете эти аннотации, сообщите нам и об этом: это может быть очень быстрым решением вашей проблемы!

Jeff Bowman 01.05.2018 19:14

Привет, Джефф, да, вы правы, после добавления моего тестового класса в сторону @PrepareForTest он работает, как ожидалось, большое спасибо за вашу помощь

user3346145 03.05.2018 18:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
1 508
1

Ответы 1

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

after adding my test class in side @PrepareForTest, it works as expected

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

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

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


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

Отличное объяснение Джефф, спасибо

user3346145 04.05.2018 09:09

@ user3346145 Добро пожаловать! Если вас устраивает этот ответ, вы можете принять ответ, щелкнув галочку выше и рядом с полем ответа. Это хороший способ сказать людям, что на этот вопрос дан ответ, и дает вам небольшой бонус к репутации за его выполнение. Удачи в работе!

Jeff Bowman 04.05.2018 17:44

Другие вопросы по теме