Nano Hash - криптовалюты, майнинг, программирование

Как внедрить зависимость при тестировании активности Android без стороннего фреймворка?

Я хочу протестировать активность Android CommentActivity, которая обычно создает и использует экземпляр CommentsDataSource (оба класса написаны мной).

public class CommentActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    :
    CommentsDataSource = new CommentsDataSource(..);
    :
  }
  :
}

Я хочу создать MockCommentsDataSource сам и хотел бы избежать использования сторонних фреймворков. (Почему? Потому что я преподаю, пытаясь уменьшить количество информации, которую мне нужно втиснуть в семестр, и количество программного обеспечения, которое нужно установить моим студентам. Я видел другие сообщения, в которых рекомендуются Guice, roboguice и Spring.)

Мой вопрос в том, как передать CommentsDataSource (или MockCommentsDataSource) в действие. Кажется нецелесообразным делать их Serializable или Parcelable, какими они должны быть, чтобы их можно было передать через Intent, с которого начинается CommentActivity. Хотя я мог бы легко передать флаг отладки, его использование потребовало бы, чтобы CommentActivity знал о MockCommentsDataSource, что на самом деле не его дело (и в отдельном приложении):

public class CommentActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    :
    debugMode = getIntent().getBooleanExtra(DEBUG_MODE, false);

    // Get a connection to the database.
    final CommentsDataSource cds = (debugMode ? 
      new MockCommentsDataSource() :   // Abstraction violation
      new CommentsDataSource(this));
      :
   }
   :
}

Как мне ввести MockCommentsDataSource в CommentActivity? FWIW, я использую Eclipse и разрабатываю последние версии SDK.

Одно из решений, которое пришло мне в голову, — использовать шаблон абстрактной фабрики, поскольку было бы относительно легко сделать фабрики сериализуемыми. Это лучший подход, учитывая мои ограничения?


Ответы:


1

Вот две идеи:

Фабрика не используется:

Это, вероятно, будет работать только для модульных тестов, а не для интеграционных тестов:

  1. Создайте метод, который возвращает CommentDataSource, например. получить источник данных комментариев ()
  2. Создайте класс, наследующий CommentActivity
  3. Переопределите getCommentsDataSource() методом, который возвращает MockCommentsDataSource.
  4. Протестируйте новый класс

Использование фабрики:

Как вы упомянули, вы можете изменить код CommentActivity, чтобы получить CommentDataSource из фабричного метода. таким образом вы можете вернуть фиктивный класс фабричным методом.

Надеюсь это поможет!

29.05.2014

2

У меня есть простое и уродливое решение, использующее приватное статическое поле для внедрения зависимости:

private static Client client;

и установите значение поля из теста с помощью отражения:

public static void setStaticFieldValue(final Class<?> clazz, 
        final String name, final Object value) throws Exception {
    final Field field = clazz.getDeclaredField(name);
    field.setAccessible(true);
    field.set(null, value);
}

затем, т.е. onCreate(), используйте этот «внедренный» тестовый экземпляр, если поле установлено, и используйте обычный экземпляр в противном случае.

Некрасиво, но требует лишь нескольких изменений, имеющих отношение к тестированию тестируемого класса.

08.09.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..