Как я могу высмеять суперкласс и подавить вызовы фактического конструктора суперкласса с помощью Mockito-inline?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу высмеять суперкласс и подавить вызовы фактического конструктора суперкласса с помощью Mockito-inline?

Сообщение Anonymous »

Я видел несколько старых вопросов об использовании обычного средства создания макетов Mockito. т. е. используя зависимость Mockito-core. Я думаю, что это не дубликат, потому что вместо этого я использую новый встроенный создатель макетов изockito-inline. Он поддерживает издевательство над конструктором, поэтому я думаю, что теперь это возможно. Я пытаюсь удалить зависимость PowerMockito, которую я использовал ранее, поэтому использование PowerMockito здесь не вариант. Я пытаюсь сделать это с помощью JUnit 4 и Mockito 5.2.
У меня есть класс в приложении для Android. BitmapCache расширяет LruCache. Конструктор LruCache выдает исключение-заглушку, как и все методы в android.os, если он не запускается на устройстве Android. Мой конструктор моего класса вызывает super(cache_size); внутри своего конструктора. Поэтому я не могу создать экземпляр для тестирования. Я хочу имитировать LruCache, а не BitmapCache, и я хочу подавить вызовы конструктора LruCache. Кажется, метод mockConstruction Mockito по-прежнему вызывает конструктор имитируемого класса. Запуск исключения-заглушки.
Возможно ли использовать функцию «mockConstruction», «mockConstructionWithAnswer» или какую-либо другую функцию с помощью нового встроенного средства создания макетов? Я хочу полностью запретить конструктору LruCache выдавать исключение-заглушку. В идеале, если это возможно, вообще не допускайте его вызова или заглушайте его пустой функцией.
Очевидно, я не могу изменить код в родительском классе, и для этого необходимо расширить LruCache. . Я думаю, что это обычная проблема при тестировании кода Android без запуска виртуальной машины для запуска тестов на устройстве Android.
Я пробовал установить defaultAnswer для всех постоянных значений, включая глубокие макеты и использование методаockConstructionWithAnswer, но, похоже, на самом деле они издеваются не над конструктором, а над любым другим методом.
Исключение всегда выдается из строки внутри попробуйте блок, где я создаю экземпляр объекта BitmapCache для тестирования.
Я также не уверен, что это проблема, связанная с тем, что LruCache является универсальным, поэтому мое издевательство выглядит так для принудительного приведения LruCache.class в Class.
try (MockedConstruction lruCache =
mockConstruction(
(Class) (Class) LruCache.class))

Я также пробовал оба этих подхода, но ни один из них не подавляет вызов конструктора LruCache.
С помощью макета, определенного как< /p>
LruCache mockCache =
mock((Class) (Class) LruCache.class;

try (MockedConstruction lruCache =
mockConstruction(
(Class) (Class) LruCache.class,
(mock, context)->{
when(mock).thenReturn(mockCache);
})){

и
try (MockedConstruction lruCache =
mockConstructionWithAnswer(
(Class) (Class) LruCache.class,
(invocation) -> mockCache)) {

Обновление: Я попытался имитировать конструктор BitmapCache, но, похоже, он не вызывает конструктор LruCache. Я думаю, что проблема, описанная выше, заключается либо в том, что методockConstruction не работает для вызовов super(), либо я неправильно указываю класс или конструкцию в своих вызовах для методаockConstruction иockConstructionWithAnswer.
Я склоняюсь к тому, что вызов super() не перехватывается. Я попытался издеваться над обоими классами, как показано ниже, и как только дочерний класс пытается вызвать «издеваемый» метод родительского класса, он фактически вызывает реальный метод и выдает исключение.
Bitmap bitmap1 = mock(Bitmap.class);
Bitmap bitmap2 = mock(Bitmap.class);
Uri uri1 = mock(Uri.class);
Uri uri2 = mock(Uri.class);

try (MockedConstruction lruCache =
mockConstruction(
(Class) (Class) LruCache.class,
(mock, context)->{
// These four calls should prevent calls to the real LruCache
// get or put methods from being called.
doNothing().when(mock.put(any(Uri.class), any(Bitmap.class)));
when(mock.get(uri1)).thenReturn(bitmap1);
when(mock.get(uri2)).thenReturn(bitmap2);
when(mock.get(any(Uri.class))).thenReturn(null);
})) {
try (MockedConstruction bitmapCache =
mockConstruction(BitmapCache.class, (mock, context)->{
when(mock.put(any(Uri.class), any(Bitmap.class)))
.thenCallRealMethod();
when(mock.get(any(Uri.class)))
.thenCallRealMethod();
})) {
BitmapLoader loader = mock(BitmapLoader.class);
cache = new BitmapCache(cacheSize, loader);

// This call calls the real BitmapCache method as expected,
// but then that method calls the real LruCache.put method
// instead of the mock.
cache.put(uri1, bitmap1);
cache.put(uri2, bitmap2);

assertEquals(cache.get(uri1), bitmap1);
assertEquals(cache.get(uri2), bitmap2);
}
}


Подробнее здесь: https://stackoverflow.com/questions/784 ... ass-constr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»