模拟属性设置器

我想在我的测试中嘲弄一个属性设置者,但我怎么也找不到任何东西。 这是我迄今为止所尝试的:

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库

一个稍微难看,但工作的解决方案嘲笑一个setter,使用绑定的属性引用来获取setter:

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