Инъекция зависимости от Arrow KT - PullRequest
0 голосов
/ 24 марта 2020

В Arrow Kt Документация по внедрению зависимости , зависимость определяется на «краю света» или в Android может быть Activity или Fragment. Итак, приведенный пример выглядит следующим образом:

import Api.*

class SettingsActivity: Activity {
  val deps = FetcherDependencies(Either.monadError(), ActivityApiService(this))

  override fun onResume() {
    val id = deps.createId("1234")

    user.text =
      id.fix().map { it.toString() }.getOrElse { "" }

    friends.text =
      deps.getUserFriends(id).fix().getOrElse { emptyList() }.joinToString()
  }
}

Но теперь я думаю, как может SettingsActivity в этом примере быть unit tested? Поскольку зависимость создается внутри действия, ее уже нельзя изменить для тестирования?

При использовании какой-либо другой библиотеки Dependency Injection это определение зависимости создается вне класса, в котором он будет использоваться. Например, в Dagger создается класс Module, чтобы определить, как создаются объекты (зависимости), а @Inject используется для «внедрения» зависимости, определенной внутри модуля. Так что теперь при модульном тестировании Activity мне просто нужно определить другой модуль или вручную установить значение зависимости для фиктивного объекта.

1 Ответ

1 голос
/ 24 марта 2020

В Dagger вы создадите класс Mock или Test, который будет @Inject вместо ActivityApiService. Здесь то же самое.

Вместо:

class ActivityApiService(val ctx: Context) {
  fun createId(): String = doOtherThing(ctx)
}

Вы делаете

interface ActivityApiService {
  fun createId(): String
}

, и теперь у вас есть 2 реализации, одна для продукта

class ActivityApiServiceImpl(val ctx: Context): ActivityApiService {
  override fun createId(): Unit = doOtherThing(ctx)
}

и еще один для тестирования

fun testBla() {
  val api =  object: ActivityApiService {
    override fun createId(): String = "4321"
  }

  val deps = FetcherDependencies(Either.monadError(), api)

  deps.createId("1234") shouldBe "4321"
}

или даже используйте Mockito или аналогичный инструмент для создания ActivityApiService.

У меня есть пара статей о том, как отделить и унитазировать вне рамок Android, которые не связаны со стрелками. Установите флажок «Безголовая разработка в полностью реактивных приложениях» и связанный с ним проект https://github.com/pakoito/FunctionalAndroidReference.

Если ваш график зависимостей слишком запутан и вам нужна некоторая компиляция, время волочится c, чтобы создать эти зависимости, вы всегда можете создать локальный класс в тестах и ​​@Inject конструктор там Смысл в том, чтобы отделить вещи, которые не являются нестабильными, например, от всей структуры Android: D

...