我在使用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数组中的类型如何, 它总会返回模拟值吗?
答案 0 :(得分:0)
Nicholas Hauschild的回答让我想到了删除powermock,并且只是单独使用常规的mockito和junit,这很有效。删除powermock并将mockito升级到v2.18.3修复了该问题。