У меня есть такой сценарий
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);
Пожалуйста помоги мне с этим
При использовании PowerMockito критически важно, чтобы мы видели ваши аннотации @RunWith
и @PrepareForTest
в тестовом классе. Пожалуйста, отредактируйте свой вопрос, чтобы включить их. (PowerMock управляет загрузчиком классов Java, поэтому эти аннотации часто являются разницей между неудачей и успехом.) Если вы не используете эти аннотации, сообщите нам и об этом: это может быть очень быстрым решением вашей проблемы!
Привет, Джефф, да, вы правы, после добавления моего тестового класса в сторону @PrepareForTest он работает, как ожидалось, большое спасибо за вашу помощь
Решено в комментариях:
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 Добро пожаловать! Если вас устраивает этот ответ, вы можете принять ответ, щелкнув галочку выше и рядом с полем ответа. Это хороший способ сказать людям, что на этот вопрос дан ответ, и дает вам небольшой бонус к репутации за его выполнение. Удачи в работе!
Что означает "но не выдавать насмешливый экземпляр во время выполнения ""?