Использование Kotlin и Mockito для имитации функций, принимающих параметры vararg - PullRequest
0 голосов
/ 30 мая 2018

У меня проблемы с использованием Powermock, Mockito и Kotlin для макетирования возвращаемого значения, когда сигнатура функции, которая требует переопределения, содержит переменные.

Функция для макета / переопределения:

public BoundStatement bind(Object... values);

Тестовый файл:

class DbSessionTest {
    var preparedStatement: PreparedStatement? = null

    @Mock
    var boundStatement: BoundStatement? = null

    @Before
    fun setup() {
        initMocks(this)
        whenever(preparedStatement?.bind(any())).thenReturn(boundStatement)

        // Also, have tried it like this
        whenever(preparedStatement?.bind(any<Array<Any>>())).thenReturn(boundStatement)
    }
}

Функциональность в реальном коде называется так:

internal fun createBoundStatement(query: String, vararg params: Any): BoundStatement {
    val preparedStatement = prepare(query)
    val boundStatement = preparedStatement.bind(*params)
    return boundStatement
}

Когда я прохожу, и varargs разыменовываются, он превращается в Object[].Когда массив объектов содержит все один и тот же тип, все работает нормально, но когда он содержит тип String и тип Integer, имитация не выполняется и возвращается null.

Примечание: у меня естьтакже включил пакет com.nhaarman.mockito_kotlin.any для их конкретной функции any и anyVararg, но это тоже не сработало.

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

1 Ответ

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

Ответ Николаса Хаушильда заставляет меня задуматься о снятии powermock и просто переходе на обычные mockito и junit по отдельности, и это сработало.Удаление powermock и обновление mockito до v2.18.3 устранили проблему.

...