Метод финального класса не проходит тестирование в соответствии с требованиями Mockito 2 - PullRequest
0 голосов
/ 25 мая 2018

Как описано в Mockito 2 docs , теперь мы можем макетировать финальные классы, поэтому я попытался сделать это в простом проекте, но результаты не верны.Вот моя структура проекта as described in link

Вот текстовый файл org.mockito.plugins.MockMaker

mock-maker-inline

Вот демонстрационное упражнение для тестирования

class LoginActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
    }

    private fun onLoginPressed(email:String, password:String){

    }

     fun isEmailValid(email: String):Boolean{
        return true
    }
}

вот класс теста

class LoginActivityTest{

    @Test
    fun checkLoginValidity(){
        val lognActivity = Mockito.mock(LoginActivity::class.java)
        assert(lognActivity.isEmailValid("yuo"))
    }
}

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

enter image description here

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

Можете ли вы указать мне, где я ошибаюсь?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы высмеяли свой класс Activity, поэтому все его методы всегда возвращают значение "по умолчанию" (для boolean это false).Вы должны сказать Mockito, чтобы вызвать реальный метод класса.

`when`(lognActivity.isEmailValid(ArgumentMatchers.any() ?: ""))
    .thenCallRealMethod()

Кстати, лучше использовать это решение только для абстрактных классов, потому что вы не можете создать его экземпляр с другимпуть.Если ваш класс не является абстрактным, просто создайте его (для Activity теста лучше использовать специальные инструменты ).

0 голосов
/ 25 мая 2018

Классы Mocking final (Kotlin) с Mockito работают нормально, и ваши настройки, очевидно, правильные (вы получите ошибку, если mocking, что Activity не получилось).Что-то не так с тем, как вы пытаетесь проверить.

Mockito используется для макетирования зависимостей класса, который вы хотите проверить, а не класса, который вы хотите проверить сам.

То, что вы делаете там, - это издевательство над вашим LoginActivity, а затем утверждение, что оно возвращает какое-то значение.Для методов, которые возвращают boolean как isEmailValid(...), макет по умолчанию возвращает false.Вы не проверяете издевательства, в этом нет никакого смысла.Вы хотите проверить «реальный» экземпляр тестируемого класса.

Если вы хотите проверить этот Activity, вы просто создадите его с помощью val classToTest = LoginActivity(), а затем выполните assert.

Это может (не уверен) работать в этом очень простом случае, но, как правило, вы не проводите модульное тестирование Activity с, потому что происходит слишком много специфичных для Android вещей, таких как раздувание макета (setContentView), который не работает в модульном тесте.

Вот почему такие концепции, как MVP или MVVM, приобрели популярность, чтобы отодвинуть столько логики от Android-классов, как Activity, а затем сделать ее тестируемой.

Для вашего случая, чтобы начать, вы можете написать EmailChecker класс, который вы a.затем используйте в своей деятельности, чтобы проверить электронную почту String и б.может лучше проверить с помощью модульного теста.

...