我想在我的测试中模拟一个属性设置者,但我找不到任何关于如何做到这一点的信息。这是我到目前为止尝试过的:
interface Foo
{
var property: Int
}
@RunWith(MockitoJUnitRunner::class)
class TestClass
{
@Mock private val fooMock: Foo = mock()
private var temp = 0
@Before
fun setup()
{
whenever(fooMock.property).then {
invocation ->
if (invocation.arguments.isEmpty())
{
// this part works fine
return@then 15
}
else
{
// this never gets called
temp = invocation.getArgument(0)
null
}
}
}
}
注意:我正在使用com.nhaarman.mockito_kotlin库
一个有点丑陋但有效的解决方案,用于模拟二传手,使用绑定属性引用来获取二传手:
whenever(fooMock::property.setter.invoke(any())).then {
println("setter called with ${it.arguments[0]}")
}
一些替代方案:
如果要验证属性是否设置为给定值,可以执行以下操作:
fooMock.property = 25
verify(fooMock).property = 25
如果要捕获属性设置为的值,可以使用 ArgumentCaptor
,如下所示:
class TestClass {
@Mock private lateinit var fooMock: Foo
@Captor private lateinit var captor: ArgumentCaptor<Int>
@Test
fun test() {
fooMock.property = 25
verify(fooMock).property = capture(captor)
assertEquals(25, captor.value)
}
}
Mockito的一般提示:这两行都创建了一个模拟,你不需要同时使用@Mock
注释和mock()
方法。
@Mock private lateinit var fooMock: Foo
private val fooMock: Foo = mock()