Skip to content

Commit 2a2ed98

Browse files
authored
Merge pull request #58 from nhaarman/mock-stubbing
Accept a stubbing lambda in mock()
2 parents 84fb7e0 + ecfaf58 commit 2a2ed98

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

mockito-kotlin/src/main/kotlin/com/nhaarman/mockito_kotlin/Mockito.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,18 @@ inline fun <reified T : Any> mock(defaultAnswer: Answer<Any>): T = Mockito.mock(
7979
inline fun <reified T : Any> mock(s: MockSettings): T = Mockito.mock(T::class.java, s)!!
8080
inline fun <reified T : Any> mock(s: String): T = Mockito.mock(T::class.java, s)!!
8181

82+
inline fun <reified T : Any> mock(stubbing: KStubbing<T>.() -> Unit): T
83+
= Mockito.mock(T::class.java)!!.apply { stubbing(KStubbing(this)) }
84+
85+
class KStubbing<out T>(private val mock: T) {
86+
fun <R> on(methodCall: R) = Mockito.`when`(methodCall)
87+
fun <R> on(methodCall: T.() -> R) = Mockito.`when`(mock.methodCall())
88+
}
89+
90+
infix fun <T> OngoingStubbing<T>.doReturn(t: T): OngoingStubbing<T> = thenReturn(t)
91+
fun <T> OngoingStubbing<T>.doReturn(t: T, vararg ts: T): OngoingStubbing<T> = thenReturn(t, *ts)
92+
inline infix fun <reified T> OngoingStubbing<T>.doReturn(ts: List<T>): OngoingStubbing<T> = thenReturn(ts[0], *ts.drop(1).toTypedArray())
93+
8294
fun mockingDetails(toInspect: Any): MockingDetails = Mockito.mockingDetails(toInspect)!!
8395
fun never(): VerificationMode = Mockito.never()!!
8496
inline fun <reified T : Any> notNull(): T? = Mockito.notNull(T::class.java)

mockito-kotlin/src/test/kotlin/MockitoTest.kt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,60 @@ class MockitoTest {
282282
mock.go()
283283
}
284284
}
285+
286+
@Test
287+
fun testMockStubbing_lambda() {
288+
/* Given */
289+
val mock = mock<Open>() {
290+
on { stringResult() } doReturn "A"
291+
}
292+
293+
/* When */
294+
val result = mock.stringResult()
295+
296+
/* Then */
297+
expect(result).toBe("A")
298+
}
299+
300+
@Test
301+
fun testMockStubbing_normalOverridesLambda() {
302+
/* Given */
303+
val mock = mock<Open>() {
304+
on { stringResult() }.doReturn("A")
305+
}
306+
whenever(mock.stringResult()).thenReturn("B")
307+
308+
/* When */
309+
val result = mock.stringResult()
310+
311+
/* Then */
312+
expect(result).toBe("B")
313+
}
314+
315+
@Test
316+
fun testMockStubbing_methodCall() {
317+
/* Given */
318+
val mock = mock<Open>()
319+
mock<Open> {
320+
on(mock.stringResult()).doReturn("A")
321+
}
322+
323+
/* When */
324+
val result = mock.stringResult()
325+
326+
/* Then */
327+
expect(result).toBe("A")
328+
}
329+
330+
@Test
331+
fun doReturn_withSingleItemList() {
332+
/* Given */
333+
val mock = mock<Open> {
334+
on { stringResult() } doReturn listOf("a", "b")
335+
}
336+
337+
/* Then */
338+
expect(mock.stringResult()).toBe("a")
339+
expect(mock.stringResult()).toBe("b")
340+
}
285341
}

0 commit comments

Comments
 (0)