Skip to content

Commit b4f703a

Browse files
m-koopsTimvdLippe
authored andcommitted
Add stubbing tests for sync and suspend functions returning value classes
1 parent a4d0bee commit b4f703a

File tree

3 files changed

+127
-0
lines changed

3 files changed

+127
-0
lines changed

tests/src/test/kotlin/test/Classes.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ interface SynchronousFunctions {
9898
fun valueClass(v: ValueClass)
9999
fun nullableValueClass(v: ValueClass?)
100100
fun nestedValueClass(v: NestedValueClass)
101+
fun valueClassResult(): ValueClass
102+
fun nullableValueClassResult(): ValueClass?
103+
fun nestedValueClassResult(): NestedValueClass
101104
}
102105

103106
interface SuspendFunctions {
@@ -110,6 +113,9 @@ interface SuspendFunctions {
110113
suspend fun stringResult(s: String): String
111114
suspend fun stringResult(s1: String, s2: String): String
112115
suspend fun nullableStringResult(): String?
116+
suspend fun valueClassResult(): ValueClass
117+
suspend fun nullableValueClassResult(): ValueClass?
118+
suspend fun nestedValueClassResult(): NestedValueClass
113119
suspend fun builderMethod(): SuspendFunctions
114120
}
115121

tests/src/test/kotlin/test/CoroutinesOngoingStubbingTest.kt

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package test
22

33
import com.nhaarman.expect.expect
4+
import kotlinx.coroutines.delay
45
import kotlinx.coroutines.runBlocking
56
import kotlinx.coroutines.test.runTest
67
import org.junit.Ignore
@@ -10,6 +11,7 @@ import org.mockito.kotlin.any
1011
import org.mockito.kotlin.doAnswer
1112
import org.mockito.kotlin.doReturn
1213
import org.mockito.kotlin.doReturnConsecutively
14+
import org.mockito.kotlin.doSuspendableAnswer
1315
import org.mockito.kotlin.doThrow
1416
import org.mockito.kotlin.mock
1517
import org.mockito.stubbing.Answer
@@ -280,4 +282,59 @@ class CoroutinesOngoingStubbingTest {
280282
/* Then */
281283
expect(result).toBe("apple + banana")
282284
}
285+
286+
@Test
287+
fun `should stub suspendable function call with value class result`() = runTest {
288+
/* Given */
289+
val valueClass = ValueClass("A")
290+
val mock = mock<SuspendFunctions> {
291+
on(mock.valueClassResult()) doSuspendableAnswer {
292+
delay(1)
293+
valueClass
294+
}
295+
}
296+
297+
/* When */
298+
val result: ValueClass = mock.valueClassResult()
299+
300+
/* Then */
301+
expect(result).toBe(valueClass)
302+
}
303+
304+
@Test
305+
fun `should stub suspendable function call with nullable value class result`() = runTest {
306+
/* Given */
307+
val valueClass = ValueClass("A")
308+
val mock = mock<SuspendFunctions> {
309+
on (mock.nullableValueClassResult()) doSuspendableAnswer {
310+
delay(1)
311+
valueClass
312+
}
313+
}
314+
315+
/* When */
316+
val result: ValueClass? = mock.nullableValueClassResult()
317+
318+
/* Then */
319+
expect(result).toBe(valueClass)
320+
}
321+
322+
@Test
323+
fun `should stub suspendable function call with nested value class result`() = runTest {
324+
/* Given */
325+
val nestedValueClass = NestedValueClass(ValueClass("A"))
326+
val mock = mock<SuspendFunctions> {
327+
on (mock.nestedValueClassResult()) doSuspendableAnswer {
328+
delay(1)
329+
nestedValueClass
330+
}
331+
}
332+
333+
/* When */
334+
val result: NestedValueClass = mock.nestedValueClassResult()
335+
336+
/* Then */
337+
expect(result).toBe(nestedValueClass)
338+
expect(result.value).toBe(nestedValueClass.value)
339+
}
283340
}

tests/src/test/kotlin/test/OngoingStubbingTest.kt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,70 @@ class OngoingStubbingTest : TestBase() {
271271
expect(m.nullableReturnType()).toBe("Test")
272272
}
273273

274+
@Test
275+
fun `should stub function call with value class result`() {
276+
/* Given */
277+
val valueClass = ValueClass("A")
278+
val mock = mock<SynchronousFunctions> {
279+
on { valueClassResult() } doReturn valueClass
280+
}
281+
282+
/* When */
283+
val result: ValueClass = mock.valueClassResult()
284+
285+
/* Then */
286+
expect(result).toBe(valueClass)
287+
}
288+
289+
@Test
290+
fun `should stub function call with nullable value class result`() {
291+
/* Given */
292+
val valueClass = ValueClass("A")
293+
val mock = mock<SynchronousFunctions> {
294+
on { nullableValueClassResult() } doReturn valueClass
295+
}
296+
297+
/* When */
298+
val result: ValueClass? = mock.nullableValueClassResult()
299+
300+
/* Then */
301+
expect(result).toBe(valueClass)
302+
}
303+
304+
@Test
305+
fun `should stub function call with nested value class result`() {
306+
/* Given */
307+
val nestedValueClass = NestedValueClass(ValueClass("A"))
308+
val mock = mock<SynchronousFunctions> {
309+
on { nestedValueClassResult() } doReturn nestedValueClass
310+
}
311+
312+
/* When */
313+
val result: NestedValueClass = mock.nestedValueClassResult()
314+
315+
/* Then */
316+
expect(result).toBe(nestedValueClass)
317+
expect(result.value).toBe(nestedValueClass.value)
318+
}
319+
320+
@Test
321+
fun `should stub consecutive function calls with value class results`() {
322+
/* Given */
323+
val valueClassA = ValueClass("A")
324+
val valueClassB = ValueClass("B")
325+
val mock = mock<SynchronousFunctions> {
326+
on { valueClassResult() }.doReturnConsecutively(listOf(valueClassA, valueClassB))
327+
}
328+
329+
/* When */
330+
val result1 = mock.valueClassResult()
331+
val result2 = mock.valueClassResult()
332+
333+
/* Then */
334+
expect(result1).toBe(valueClassA)
335+
expect(result2).toBe(valueClassB)
336+
}
337+
274338
@Test
275339
fun doReturn_throwsNPE() {
276340
assumeFalse(mockMakerInlineEnabled())

0 commit comments

Comments
 (0)