Skip to content

Commit 4779b29

Browse files
committed
Merge branch 'checketts-2.x' into 2.x
2 parents b850ab1 + 77bfcdd commit 4779b29

File tree

2 files changed

+169
-0
lines changed

2 files changed

+169
-0
lines changed

mockito-kotlin/src/main/kotlin/com/nhaarman/mockitokotlin2/ArgumentCaptor.kt

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,99 @@ inline fun <reified T : Any> argumentCaptor(): KArgumentCaptor<T> {
3636
return KArgumentCaptor(ArgumentCaptor.forClass(T::class.java), T::class)
3737
}
3838

39+
/**
40+
* Creates 2 [KArgumentCaptor]s for given types.
41+
*/
42+
inline fun <reified A : Any, reified B : Any> argumentCaptor(
43+
a: KClass<A> = A::class,
44+
b: KClass<B> = B::class
45+
): Pair<KArgumentCaptor<A>, KArgumentCaptor<B>> {
46+
return Pair(
47+
KArgumentCaptor(ArgumentCaptor.forClass(a.java), a),
48+
KArgumentCaptor(ArgumentCaptor.forClass(b.java), b)
49+
)
50+
}
51+
52+
/**
53+
* Creates 3 [KArgumentCaptor]s for given types.
54+
*/
55+
inline fun <reified A : Any, reified B : Any, reified C : Any> argumentCaptor(
56+
a: KClass<A> = A::class,
57+
b: KClass<B> = B::class,
58+
c: KClass<C> = C::class
59+
): Triple<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>> {
60+
return Triple(
61+
KArgumentCaptor(ArgumentCaptor.forClass(a.java), a),
62+
KArgumentCaptor(ArgumentCaptor.forClass(b.java), b),
63+
KArgumentCaptor(ArgumentCaptor.forClass(c.java), c)
64+
)
65+
}
66+
67+
class ArgumentCaptorHolder4<out A, out B, out C, out D>(
68+
val first: A,
69+
val second: B,
70+
val third: C,
71+
val fourth: D
72+
) {
73+
74+
operator fun component1() = first
75+
operator fun component2() = second
76+
operator fun component3() = third
77+
operator fun component4() = fourth
78+
}
79+
80+
class ArgumentCaptorHolder5<out A, out B, out C, out D, out E>(
81+
val first: A,
82+
val second: B,
83+
val third: C,
84+
val fourth: D,
85+
val fifth: E
86+
) {
87+
88+
operator fun component1() = first
89+
operator fun component2() = second
90+
operator fun component3() = third
91+
operator fun component4() = fourth
92+
operator fun component5() = fifth
93+
}
94+
95+
96+
/**
97+
* Creates 4 [KArgumentCaptor]s for given types.
98+
*/
99+
inline fun <reified A : Any, reified B : Any, reified C : Any, reified D : Any> argumentCaptor(
100+
a: KClass<A> = A::class,
101+
b: KClass<B> = B::class,
102+
c: KClass<C> = C::class,
103+
d: KClass<D> = D::class
104+
): ArgumentCaptorHolder4<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>, KArgumentCaptor<D>> {
105+
return ArgumentCaptorHolder4(
106+
KArgumentCaptor(ArgumentCaptor.forClass(a.java), a),
107+
KArgumentCaptor(ArgumentCaptor.forClass(b.java), b),
108+
KArgumentCaptor(ArgumentCaptor.forClass(c.java), c),
109+
KArgumentCaptor(ArgumentCaptor.forClass(d.java), d)
110+
)
111+
}
112+
113+
/**
114+
* Creates 4 [KArgumentCaptor]s for given types.
115+
*/
116+
inline fun <reified A : Any, reified B : Any, reified C : Any, reified D : Any, reified E : Any> argumentCaptor(
117+
a: KClass<A> = A::class,
118+
b: KClass<B> = B::class,
119+
c: KClass<C> = C::class,
120+
d: KClass<D> = D::class,
121+
e: KClass<E> = E::class
122+
): ArgumentCaptorHolder5<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>, KArgumentCaptor<D>, KArgumentCaptor<E>> {
123+
return ArgumentCaptorHolder5(
124+
KArgumentCaptor(ArgumentCaptor.forClass(a.java), a),
125+
KArgumentCaptor(ArgumentCaptor.forClass(b.java), b),
126+
KArgumentCaptor(ArgumentCaptor.forClass(c.java), c),
127+
KArgumentCaptor(ArgumentCaptor.forClass(d.java), d),
128+
KArgumentCaptor(ArgumentCaptor.forClass(e.java), e)
129+
)
130+
}
131+
39132
/**
40133
* Creates a [KArgumentCaptor] for given type, taking in a lambda to allow fast verification.
41134
*/

tests/src/test/kotlin/test/ArgumentCaptorTest.kt

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,82 @@ class ArgumentCaptorTest : TestBase() {
2222
expect(captor.lastValue).toBe(5L)
2323
}
2424

25+
@Test
26+
fun argumentCaptor_destructuring2() {
27+
/* Given */
28+
val date: Date = mock()
29+
30+
/* When */
31+
date.time = 5L
32+
33+
/* Then */
34+
val (captor1, captor2) = argumentCaptor<Long, Long>()
35+
verify(date).time = captor1.capture()
36+
verify(date).time = captor2.capture()
37+
expect(captor1.lastValue).toBe(5L)
38+
expect(captor2.lastValue).toBe(5L)
39+
}
40+
41+
@Test
42+
fun argumentCaptor_destructuring3() {
43+
/* Given */
44+
val date: Date = mock()
45+
46+
/* When */
47+
date.time = 5L
48+
49+
/* Then */
50+
val (captor1, captor2, captor3) = argumentCaptor<Long, Long, Long>()
51+
val verifyCaptor: KArgumentCaptor<Long>.() -> Unit = {
52+
verify(date).time = capture()
53+
expect(lastValue).toBe(5L)
54+
}
55+
captor1.apply(verifyCaptor)
56+
captor2.apply(verifyCaptor)
57+
captor3.apply(verifyCaptor)
58+
}
59+
60+
@Test
61+
fun argumentCaptor_destructuring4() {
62+
/* Given */
63+
val date: Date = mock()
64+
65+
/* When */
66+
date.time = 5L
67+
68+
/* Then */
69+
val (captor1, captor2, captor3, captor4) = argumentCaptor<Long, Long, Long, Long>()
70+
val verifyCaptor: KArgumentCaptor<Long>.() -> Unit = {
71+
verify(date).time = capture()
72+
expect(lastValue).toBe(5L)
73+
}
74+
captor1.apply(verifyCaptor)
75+
captor2.apply(verifyCaptor)
76+
captor3.apply(verifyCaptor)
77+
captor4.apply(verifyCaptor)
78+
}
79+
80+
@Test
81+
fun argumentCaptor_destructuring5() {
82+
/* Given */
83+
val date: Date = mock()
84+
85+
/* When */
86+
date.time = 5L
87+
88+
/* Then */
89+
val (captor1, captor2, captor3, captor4, captor5) = argumentCaptor<Long, Long, Long, Long, Long>()
90+
val verifyCaptor: KArgumentCaptor<Long>.() -> Unit = {
91+
verify(date).time = capture()
92+
expect(lastValue).toBe(5L)
93+
}
94+
captor1.apply(verifyCaptor)
95+
captor2.apply(verifyCaptor)
96+
captor3.apply(verifyCaptor)
97+
captor4.apply(verifyCaptor)
98+
captor5.apply(verifyCaptor)
99+
}
100+
25101
@Test
26102
fun argumentCaptor_withNullValue_usingNonNullable() {
27103
/* Given */

0 commit comments

Comments
 (0)