Я видел несколько старых вопросов об использовании обычного средства создания макетов 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
Как я могу высмеять суперкласс и подавить вызовы фактического конструктора суперкласса с помощью Mockito-inline? ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Имитировать метод __init__ суперкласса или суперкласс в целом для тестирования.
Anonymous » » в форуме Python - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-