模拟属性设置器
我想在我的测试中嘲弄一个属性设置者,但我怎么也找不到任何东西。 这是我迄今为止所尝试的:
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()