Skip to content

Commit ce93783

Browse files
committed
Merge pull request #12 from codeborne/master
Better spy support + argumentCaptor + tests
2 parents 0efd093 + 66e3be5 commit ce93783

File tree

4 files changed

+80
-1
lines changed

4 files changed

+80
-1
lines changed

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,15 @@
2525

2626
package com.nhaarman.mockito_kotlin
2727

28+
import org.mockito.ArgumentCaptor
2829
import org.mockito.Mockito
30+
import org.mockito.stubbing.Answer
31+
import org.mockito.stubbing.Stubber
2932
import org.mockito.verification.VerificationMode
3033
import kotlin.reflect.KClass
3134

3235
inline fun <reified T : Any> mock() = Mockito.mock(T::class.java)
36+
inline fun <reified T : Any> mock(defaultAnswer: Answer<Any>) = Mockito.mock(T::class.java, defaultAnswer)
3337
fun <T : Any> spy(value: T) = Mockito.spy(value)
3438

3539
fun <T> whenever(methodCall: T) = Mockito.`when`(methodCall)
@@ -40,6 +44,20 @@ fun <T> reset(mock: T) = Mockito.reset(mock)
4044

4145
fun inOrder(vararg value: Any) = Mockito.inOrder(*value)
4246
fun never() = Mockito.never()
47+
fun times(numInvocations: Int) = Mockito.times(numInvocations)
48+
fun atLeast(numInvocations: Int) = Mockito.atLeast(numInvocations)
49+
fun atLeastOnce() = Mockito.atLeastOnce()
50+
51+
fun doReturn(value: Any) = Mockito.doReturn(value)
52+
fun doThrow(throwable: Throwable) = Mockito.doThrow(throwable)
53+
fun <T> doAnswer(answer: Answer<T>) = Mockito.doAnswer(answer)
54+
fun doCallRealMethod() = Mockito.doCallRealMethod()
55+
fun doNothing() = Mockito.doNothing()
56+
57+
fun <T> Stubber.whenever(mock: T) = `when`(mock)
58+
59+
inline fun <reified T : Any> argumentCaptor() = ArgumentCaptor.forClass(T::class.java)
60+
inline fun <reified T : Any> capture(captor: ArgumentCaptor<T>): T = captor.capture() ?: createInstance<T>()
4361

4462
inline fun <reified T : Any> eq(value: T) = Mockito.eq(value) ?: createInstance<T>()
4563
inline fun <reified T : Any> anyArray(): Array<T> = Mockito.any(Array<T>::class.java) ?: arrayOf()
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import com.nhaarman.mockito_kotlin.argumentCaptor
2+
import com.nhaarman.mockito_kotlin.mock
3+
import com.nhaarman.mockito_kotlin.verify
4+
import com.nhaarman.expect.expect
5+
import com.nhaarman.mockito_kotlin.capture
6+
import org.junit.Test
7+
import java.util.*
8+
9+
class ArgumentCaptorTest {
10+
@Test
11+
fun captor() {
12+
val date: Date = mock()
13+
val time = argumentCaptor<Long>()
14+
15+
date.time = 5L
16+
17+
verify(date).time = capture(time)
18+
expect(time.value).toBe(5L)
19+
}
20+
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525

2626
import com.nhaarman.expect.expect
2727
import com.nhaarman.mockito_kotlin.mock
28+
import com.nhaarman.mockito_kotlin.whenever
2829
import org.junit.Test
30+
import org.mockito.Mockito.RETURNS_DEEP_STUBS
2931
import org.mockito.exceptions.base.MockitoException
32+
import java.util.*
3033

3134
class MockTest {
3235

@@ -82,6 +85,13 @@ class MockTest {
8285
mock<ClosedClass>()
8386
}
8487

88+
@Test
89+
fun deepStubs() {
90+
val cal: Calendar = mock(RETURNS_DEEP_STUBS)
91+
whenever(cal.time.time).thenReturn(123L)
92+
expect(cal.time.time).toBe(123L)
93+
}
94+
8595
private interface MyInterface
8696
private open class MyClass
8797
private class ClosedClass

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

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424
*/
2525

2626
import com.nhaarman.expect.expect
27-
import com.nhaarman.mockito_kotlin.spy
27+
import com.nhaarman.mockito_kotlin.*
2828
import org.junit.After
2929
import org.junit.Test
3030
import org.mockito.Mockito
3131
import org.mockito.exceptions.base.MockitoException
32+
import java.util.*
3233

3334
class SpyTest {
3435

@@ -66,6 +67,36 @@ class SpyTest {
6667
spy(closedClassInstance)
6768
}
6869

70+
@Test
71+
fun doReturnWithSpy() {
72+
val date = spy(Date())
73+
doReturn(123L).whenever(date).time
74+
expect(date.time).toBe(123L)
75+
}
76+
77+
@Test
78+
fun doNothingWithSpy() {
79+
val date = spy(Date(0))
80+
doNothing().whenever(date).time = 5L
81+
date.time = 5L;
82+
expect(date.time).toBe(0L)
83+
}
84+
85+
@Test(expected = IllegalArgumentException::class)
86+
fun doThrowWithSpy() {
87+
val date = spy(Date(0))
88+
doThrow(IllegalArgumentException()).whenever(date).time
89+
date.time
90+
}
91+
92+
@Test
93+
fun doCallRealMethodWithSpy() {
94+
val date = spy(Date(0))
95+
doReturn(123L).whenever(date).time
96+
doCallRealMethod().whenever(date).time
97+
expect(date.time).toBe(0L)
98+
}
99+
69100
private interface MyInterface
70101
private open class MyClass : MyInterface
71102
private class ClosedClass

0 commit comments

Comments
 (0)