Skip to content

Commit 5a303f6

Browse files
author
Clint Checketts
committed
Add argumentCaptor that create many at once for easy destructuring
1 parent 3139a2c commit 5a303f6

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,54 @@ 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> argumentCaptor2(): Pair<KArgumentCaptor<A>, KArgumentCaptor<B>> {
43+
return Pair(KArgumentCaptor(ArgumentCaptor.forClass(A::class.java), A::class),
44+
KArgumentCaptor(ArgumentCaptor.forClass(B::class.java), B::class))
45+
}
46+
47+
/**
48+
* Creates 3 [KArgumentCaptor]s for given types.
49+
*/
50+
inline fun <reified A: Any, reified B: Any, reified C: Any> argumentCaptor3(): Triple<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>> {
51+
return Triple(
52+
KArgumentCaptor(ArgumentCaptor.forClass(A::class.java), A::class),
53+
KArgumentCaptor(ArgumentCaptor.forClass(B::class.java), B::class),
54+
KArgumentCaptor(ArgumentCaptor.forClass(C::class.java), C::class))
55+
}
56+
57+
data class ArgumentCaptorHolder4<out A, out B, out C, out D>(
58+
val first: A, val second: B, val third: C, val fourth: D)
59+
data class ArgumentCaptorHolder5<out A, out B, out C, out D, out E>(
60+
val first: A, val second: B, val third: C, val fourth: D, val fifth: E)
61+
62+
63+
/**
64+
* Creates 4 [KArgumentCaptor]s for given types.
65+
*/
66+
inline fun <reified A: Any, reified B: Any, reified C: Any, reified D: Any> argumentCaptor4(): ArgumentCaptorHolder4<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>, KArgumentCaptor<D>> {
67+
return ArgumentCaptorHolder4(
68+
KArgumentCaptor(ArgumentCaptor.forClass(A::class.java), A::class),
69+
KArgumentCaptor(ArgumentCaptor.forClass(B::class.java), B::class),
70+
KArgumentCaptor(ArgumentCaptor.forClass(C::class.java), C::class),
71+
KArgumentCaptor(ArgumentCaptor.forClass(D::class.java), D::class))
72+
}
73+
/**
74+
* Creates 4 [KArgumentCaptor]s for given types.
75+
*/
76+
inline fun <reified A: Any, reified B: Any, reified C: Any, reified D: Any, reified E: Any> argumentCaptor5(): ArgumentCaptorHolder5<KArgumentCaptor<A>, KArgumentCaptor<B>, KArgumentCaptor<C>, KArgumentCaptor<D>, KArgumentCaptor<E>> {
77+
return ArgumentCaptorHolder5(
78+
KArgumentCaptor(ArgumentCaptor.forClass(A::class.java), A::class),
79+
KArgumentCaptor(ArgumentCaptor.forClass(B::class.java), B::class),
80+
KArgumentCaptor(ArgumentCaptor.forClass(C::class.java), C::class),
81+
KArgumentCaptor(ArgumentCaptor.forClass(D::class.java), D::class),
82+
KArgumentCaptor(ArgumentCaptor.forClass(E::class.java), E::class))
83+
}
84+
85+
86+
3987
/**
4088
* Creates a [KArgumentCaptor] for given type, taking in a lambda to allow fast verification.
4189
*/

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) = argumentCaptor2<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) = argumentCaptor3<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) = argumentCaptor4<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) = argumentCaptor5<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)