Можно ли протестировать этот класс Kotlin? - PullRequest
2 голосов
/ 16 февраля 2020

Я пытаюсь написать примеры модульных тестов для Kotlin класса A и пытаюсь смоделировать возвращение вызова client (), присутствующего в методе test (), в метод модульного теста ():

A.kt kotlin class:
class A (par 1, par 2) : B(par 1, par 2) {
   override fun test(item: String): Boolean {
      return client()
   }
}


B.kt kotlin class:
abstract class B(par 1, par 2) {
    private val client: WebClient by lazy {
        //does something
    }
    protected fun client(): WebClient = client
}

Можно ли смоделировать вызов client () в методе test ()? И если возможно, как это сделать и какую библиотеку использовать для насмешек?

1 Ответ

0 голосов
/ 16 февраля 2020

Это можно сделать с помощью Mockito инфраструктуры тестирования. Однако насмешка над объектом, возвращаемым из метода объекта, потребует насмешки над самим объектом.

val mockOfA = Mockito.mock(A::class)
val mockOfClient = Mockito.mock(WebClient:class)
Mockito.when(mockOfA.test(anyString())).thenReturn(mockOfClient)  // Mind your original snippet return type Boolean from A.test()

Если в вашем классе A реализованы внутренние логики c, которые вы хотите протестировать в тестовом сценарии, существует два возможных пути:

  • Создать Шпион вместо насмешки. Моксы делают только то, что вы их явно настроили. Шпион «возвращается» к исходной реализации, когда ему не дано никакого фиктивного поведения.
  • Переписать ваш класс A, чтобы он зависел от внешней зависимости ClientProvider, чтобы получить экземпляр WebClient для вернитесь в метод test() и вставьте макет указанного провайдера в ваш объект типа A во время теста.
...