высмеивание внутренних классов с помощью mockito - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть тестируемый класс, помеченный как "interal"

internal class UnderTest{
    fun methodToTest(){}
}

В моем тесте JUnit я хочу пройти тест UnderTest импорт com.nhaarman.mockito_kotlin.mock

class SimpleTest{
    val mock = mock<UnderTest>()

    @Test
    fun test(){
        assertThat(....)
    } 
}

И тут становится немного странно, так как Android Studio сначала жалуется, что UnderTest не виден "публичное свойство выставляет свой частный тип". Это потому, что UnderTest помечен как внутренний.

Я изменил сам тест на внутренний, в результате чего компилятор снова счастлив:

import com.nhaarman.mockito_kotlin.mock

internal class SimpleTest{
    val mock = mock<UnderTest>()

    @Test
    fun test(){
        assertThat(....)
    } 
}

Запуск этого теста приводит к исключению mockito, как в старых версиях mockito

Cannot mock/spy class com.name.UnderTest
Mockito cannot mock/spy because :
- final class

Я хочу написать Unit Test для этих внутренних классов, но как без удаления внутреннего модификатора из класса UnderTest?

Спасибо

1 Ответ

2 голосов
/ 02 апреля 2019

Проблема не в том, что класс internal (это эквивалентно public в том же модуле), а в том, что он final. По умолчанию все классы в Kotlin final, если вы не пометите их как open.

Так что если вы хотите издеваться над своим классом, вы должны пометить его как internal open class Xyz. Обратите внимание, что есть плагин Maven / Gradle, который автоматически открывает для вас все классы: полностью открытый плагин .

Например, для следующего класса Kotlin:

internal open class Foo

Проходят следующие юнит-тесты:

class FooTest {
    @Test
    fun shouldPass() {
        Mockito.mock(Foo::class.java)
    }
}
...