Kotlin и Mockito - насмешливая функция вызова суперкласса - PullRequest
0 голосов
/ 09 октября 2018

У меня есть некоторые проблемы с Mockito и заглушением методов, которые используют класс в качестве параметра в Kotlin.

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

open interface interfaceFile {
  fun someFun(param1: String): String
} 

abstact class abstractClass {
  abstract val variable1: RandomType

  open fun<T> getObject(param1: String, param2: Class<T>, vararg param3: Any): T? {
    doSomeStuff()
}

open class concreteClass @Autowired constructor(
    override val variable1: RandomType
  ): abstractClass(), interfaceFile {

    override fun someFun(param1: String): String {
      return getObject(param1, string::Class.java)!!

}

Затем я попытался использовать mockito, чтобы смоделировать функцию getObject и проверить ее следующим образом:

fun setUp() {
  MockitoAnnotations.initMock(this)
  testObject = mock(concreteClass::class.java)
}

fun testSomeFun() {
  `when`(testObject!!.getObject("string1", String::class.java)).thenReturn("Mocked")
  val actualResponse = testObject!!.someFun("string1")
  assertEquals("message", "Mocked", actualResponse)
}

Короче говоря, concreteClass.someFun вызовет abstractClass.getObject, который вызовет doSomeStuff.Но во время тестирования я хочу заглушить abstractClass.getObject, чтобы просто вернуться.Но текущее поведение, похоже, таково, что вместо этого я всегда получаю null.

Я упростил его до того момента, когда он принимает один строковый параметр, а затем заглушает его, но кажется, что когда я представляюТип класса как параметр перестает работать.

Похоже, что моя проблема связана с неправильным сопоставлением аргументов в моем вызове when, но я не могу понять, что с ним не так, поскольку я дажевведите точные значения вместо использования ArgumentMatchers.Любые предложения будут с благодарностью.

1 Ответ

0 голосов
/ 09 октября 2018

Ваш метод someFun взят из интерфейса, поэтому мы можем сказать, что он тоже open.Вот почему в макете это переопределено с возвращением нуля.Для этого назовите основной код, напишите следующее:

`when`(testObject!!.someFun("string1")).thenCallRealMethod()

Кстати.Почему ваш testObject обнуляется?Установите его lateinit var testObject: concreteClass, чтобы инициализировать его в функции setUp.

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