模拟属性设置器



我想在我的测试中模拟一个属性设置者,但我找不到任何关于如何做到这一点的信息。这是我到目前为止尝试过的:

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()

最新更新