使用Kotlin和Mockito来模拟采用vararg参数的函数

时间:2018-05-30 20:30:58

标签: unit-testing kotlin mockito variadic-functions powermock

我在使用Powermock,Mockito和Kotlin模拟返回值时遇到问题 需要覆盖的函数签名包含varargs。

模拟/覆盖的功能:

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 :(得分:0)

Nicholas Hauschild的回答让我想到了删除powermock,并且只是单独使用常规的mockito和junit,这很有效。删除powermock并将mockito升级到v2.18.3修复了该问题。