mockk kotlin остальные api обратный звонок - PullRequest
0 голосов
/ 23 июня 2019

У меня читайте здесь . Это близко к моей проблеме, и мне нужно больше рекомендаций по этой части.

Учитывая,

class Journey{
    fun start(){
        Service.getInstance().getProductInfo(activity,object: Service.Callback<Product>{
            override fun onSuccess(data: Product) {
                showProductInfo(activity, data, customer)
            }

            override fun onError(e: Throwable) {
                showError(e)
            }
        })
    }

}

и я хочу смоделировать Service.getProductInfo и выполнить обработку «счастливый путь» и «недовольный путь», как мне это сделать с помощью mockk?

Дополнительный вопрос, есть ли способ исключить определенные функции, такие как запуск выше в jacoco? Иногда некоторые функции не имеют большого значения для модульного тестирования, и исключение их в jacoco имеет гораздо больший смысл.

UPDATE:

Я узнал от веб-сайта Gradle, что в настоящее время он не поддерживает исключение методов.

Интерфейс обратного вызова ниже

interface Callback<T>{
   fun onSuccess(data: T)
   fun onError(e: Throwable)
}

Я использую модификацию для Сервиса.

1 Ответ

0 голосов
/ 24 июня 2019

Во-первых, вы не хотите исключать свой код из проверки покрытия кода, потому что это ваш собственный код, и его необходимо протестировать.

Для основной проблемы. В этом конкретном (потому что в основном я бы вообще не использовал этот дизайн) случае я выбрал бы способ сначала смоделировать метод getInstance, чтобы он возвращал любой макет, который вы хотите использовать в своих тестах. Первое, что приходит на ум, - это использование PowerMockito (или подобных фреймворков). PowerMockito позволяет вам смоделировать статический метод (см. https://github.com/powermock/powermock/wiki/mockstatic) или, что немного хуже, на мой взгляд, но полностью зависит от вас), смоделировать конструкцию объекта внутри фабричного метода с помощью https://github.com/powermock/powermock/wiki/MockConstructor

Мой наименее любимый подход (если вы как-то не можете использовать PowerMock в своем коде) для этого (насколько я понимаю, это статический метод класса Service) можно найти здесь: https://hackernoon.com/mocking-static-method-in-kotlin-614df89482ae Это довольно просто, но вам нужно будет переписать свой код, чтобы использовать его. Но если вы можете переписать ваш код, лучше перепроектировать его, чтобы сделать его более тестируемым.

Редактировать: только что понял, что вам нужно сделать это с mockk. Я не очень разбираюсь с этим, но AFAIK имеет почти такую ​​же функциональность с staticMockk. Вы можете увидеть этот вопрос, чтобы проверить его: Макет статических методов Java с использованием Mockk

...