Как шпионить за конструктором класса из внешней зависимости в Mockk? - PullRequest
0 голосов
/ 05 марта 2020

Скажем, у меня тестируется юнит, подобный этому:

internal class MySerializer {
    fun serialize(): ByteArray {
        val initialBufferSize = 1000
        val autoResizeBuffer = true
        val value = ThirdPartySerializer(initialBufferSize, autoResizeBuffer)
        value.doMoreStuff()
        return value.serialize()
    }
}

Как я могу шпионить за ThirdPartySerializer, который поступает из сторонней библиотеки, чтобы убедиться, что он вызывается с true в качестве второго аргумента?

Обычно я проверяю результат, а не способ вызова функций, но в этом случае проверка вызова конструктора идеальна: в противном случае мне пришлось бы написать тест, чтобы убедиться, что вывод может быть больше 1000 байт, что проблематично c, потому что константа «1000» может выйти из син c, и я не хотел бы выставлять ее как постоянную c в проверяемом оборудовании, чтобы ее можно было использовать в его испытания.

1 Ответ

1 голос
/ 05 марта 2020

Я не знаю, как сделать такую ​​вещь на JVM.

Однако я не понимаю, почему вы просто не сделали бы

fun serialize(val initialBufferSize: Int = 1000): ByteArray {
    val autoResizeBuffer = true
    val value = ThirdPartySerializer(initialBufferSize, autoResizeBuffer)
    value.doMoreStuff()
    return value.serialize()
}

А потом Протестируйте размер вывода с любым начальным размером буфера. Это также приводит к тому, что вы фактически тестируете поведение, а не просто предполагаете, что все будет в порядке, если вы передадите это легендарное «истинное» значение.

Это также означает, что ваши тесты не нужно будет обновлять, если сторонняя библиотека lib решит изменить свой внешний API или вы решите использовать другую библиотеку в своей реализации. Ваш подход может даже скрыть ошибки, если значение второго аргумента будет изменено в будущем выпуске библиотеки.

...