Тестирование некоторого тяжелого кода потребления памяти - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть некоторый кеш-класс, который объединяет несколько тяжелых объектов для оптимизации в производстве. Мне нужно протестировать код, который использует кеш, но logi c не относится к кешу. Как я могу избежать использования кеша? И запускайте получение объектов на лету, не используя кеш. Я думал об отражении, но оно заставляет меня страдать. Это проблема дизайна или, может быть, я пытаюсь сделать что-то не так?

case class SomeObject()

class FooService(private val cacheMap: collection.mutable.Map[String, SomeObject]) {

  /// some cache logic with put objects to cache

  def put(key: String, value: SomeObject): collection.mutable.Map[String, SomeObject] = cacheMap += key -> value

  def get(key: String): Option[SomeObject] = cacheMap.get(key)

  private def loadFromFile(file: String): SomeObject = ???

  def loadObject(key: String): SomeObject = {
      // ... some logic from loading 
    cacheMap.getOrElseUpdate(key, loadFromFile("some_path"))
  }
}


class Bar {

  val fooCache = new FooService(collection.mutable.Map.empty[String, SomeObject])

  def methodForTest(args: List[String]): SomeObject = {
    // do some logic ...
    val someObject = fooCache.loadObject("someKey") // here I can't create filePath for loading directly from file
    // fooCache updates, but I don't want it
    someObject
  }
}

1 Ответ

1 голос
/ 03 апреля 2020

Вам нужно немного инвертировать управление:

1) Сделать FooService a trait со всеми нереализованными методами

2) Переименовать ваш FooService с реализованными методами во что-то как FooServiceImpl, сделайте его extend FooService

На этом этапе вы должны подумать, какой метод будет частью интерфейса FooService, а какой будет скрыт внутри FooServiceImpl. Скорее всего FooService не нужны оба loadObject amd get

3) Сделать fooCache аргументом конструктора в Bar:

class Bar(fooCache: FooService)

4) При запуске тестов пройти более простую реализацию FooService:

assert(new Bar(new DummyService)).methodForTest(Nil) == "Expected")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...