Метод Мокито, а не издевательство из моего надруганного пользовательского класса [Kotlin - Android] - PullRequest
0 голосов
/ 07 ноября 2019

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

open class DataManager(var context: Context) {

    fun startDataManager(){
        if(checkFileExists()){
            startTask()
        }
    }

    fun checkFileExists(): Boolean {
        val mFile: File = context.getDatabasePath("FILE_NAME")
        return mFile.exists()
    }

    fun startTask(){
        //TODO Task here
    }
}

Итак, смысл в том, чтобы проверить, вызывается ли метод checkFileExists при вызове метода startDataManager извне. Вот как я пытался все смоделировать:

@Test
fun checkFileExists_onDataManagerStart(){
    val dataManagerMock = mock(DataManager::class.java)
    `when`(dataManagerMock.checkFileExists()).thenReturn(true)

    dataManagerMock.startDataManager()

    verify(dataManagerMock, times(1)).checkFileExists()
}

Поэтому, когда я запускаю этот тест, я получаю сообщение об ошибке context внутри checkFileExists() метода null, и он не может проверитьесли настоящий файл существует.

java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.content.Context.getDatabasePath(java.lang.String)' on a null object reference at
.data.DataManager.checkFileExists(DataManager.kt:20)

Что касается моего понимания Мокито, то, когда я издеваюсь над своим классом, оно также должно издеваться над методами. Затем я заставляю return true для метода, который я хочу проверить, поэтому, когда я вызываю его, он не должен запускать реальный код в этом методе. Это правильно? Что мне там не хватает?

Если это возможно, я бы предпочел не использовать какую-либо другую библиотеку (обертку) для Mockito. У меня есть некоторые ограничения на использование библиотеки.

Заранее спасибо.

1 Ответ

0 голосов
/ 14 ноября 2019

Дело в том, что вашему классу DataManager требуется android Context, и у Mockito есть проблемы с его имитацией (несмотря на то, что он выглядит так, как должен). Согласно 5-му принципу SOLID, создайте интерфейс с именем DataManager с методами

fun startDataManager()
fun checkFileExists(): Boolean 
fun startTask()

Реализуйте его в некотором классе и замените реализацию абстракцией.

С этим вы можете легко издеваться и использовать его.

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

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