Skip to content

Commit 771f761

Browse files
authored
Merge pull request #110 from nhaarman/graciously_fail
Add backup when mocking fails
2 parents fa27978 + c8fecf0 commit 771f761

File tree

3 files changed

+71
-9
lines changed

3 files changed

+71
-9
lines changed

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

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,31 @@ inline fun <reified T : Any> createInstance() = createInstance(T::class)
6464

6565
@Suppress("UNCHECKED_CAST")
6666
fun <T : Any> createInstance(kClass: KClass<T>): T {
67+
var cause: Throwable? = null
6768
return MockitoKotlin.instanceCreator(kClass)?.invoke() as T? ?:
68-
when {
69-
kClass.hasObjectInstance() -> kClass.objectInstance!!
70-
kClass.isPrimitive() -> kClass.toDefaultPrimitiveValue()
71-
kClass.isMockable() -> kClass.java.uncheckedMock()
72-
kClass.isEnum() -> kClass.java.enumConstants.first()
73-
kClass.isArray() -> kClass.toArrayInstance()
74-
kClass.isClassObject() -> kClass.toClassObject()
75-
else -> kClass.easiestConstructor().newInstance()
69+
try {
70+
when {
71+
kClass.hasObjectInstance() -> kClass.objectInstance!!
72+
kClass.isPrimitive() -> kClass.toDefaultPrimitiveValue()
73+
kClass.isEnum() -> kClass.java.enumConstants.first()
74+
kClass.isArray() -> kClass.toArrayInstance()
75+
kClass.isClassObject() -> kClass.toClassObject()
76+
kClass.isMockable() -> try {
77+
kClass.java.uncheckedMock()
78+
} catch(e: Throwable) {
79+
cause = e
80+
kClass.easiestConstructor().newInstance()
81+
}
82+
else -> kClass.easiestConstructor().newInstance()
83+
}
84+
} catch(e: Exception) {
85+
if (e is MockitoKotlinException) throw e
86+
87+
cause?.let {
88+
@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
89+
(e as java.lang.Throwable).initCause(it)
90+
}
91+
throw MockitoKotlinException("Could not create an instance for $kClass.", e)
7692
}
7793
}
7894

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,24 @@ class CreateInstanceTest {
476476
expect(result.second).toBe(2)
477477
}
478478

479+
@Test
480+
fun sealedClass() {
481+
/* When */
482+
val result = createInstance(MySealedClass::class)
483+
484+
/* Then */
485+
expect(result).toNotBeNull()
486+
}
487+
488+
@Test
489+
fun sealedClassMember() {
490+
/* When */
491+
val result = createInstance(MySealedClass.MySealedClassMember::class)
492+
493+
/* Then */
494+
expect(result).toNotBeNull()
495+
}
496+
479497
private class PrivateClass private constructor(val data: String)
480498

481499
class ClosedClass
@@ -537,4 +555,8 @@ class CreateInstanceTest {
537555
}
538556

539557
enum class MyEnum { VALUE, ANOTHER_VALUE }
558+
559+
sealed class MySealedClass {
560+
class MySealedClassMember : MySealedClass()
561+
}
540562
}

mockito-kotlin/src/testInlineMockito/kotlin/CreateInstanceInlineTest.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424

2525
import com.nhaarman.expect.expect
26+
import com.nhaarman.expect.expectErrorWithMessage
2627
import com.nhaarman.mockito_kotlin.*
2728
import org.junit.Test
2829
import java.io.IOException
@@ -105,7 +106,7 @@ class CreateInstanceInlineTest {
105106
/* Then */
106107
expect(i).toBe(0)
107108
}
108-
109+
109110
@Test
110111
fun createStringInstance() {
111112
/* When */
@@ -115,10 +116,33 @@ class CreateInstanceInlineTest {
115116
expect(s).toBe("")
116117
}
117118

119+
@Test
120+
fun sealedClass_fails() {
121+
/* Expect */
122+
expectErrorWithMessage("Could not create") on {
123+
124+
/* When */
125+
createInstance(MySealedClass::class)
126+
}
127+
}
128+
129+
@Test
130+
fun sealedClassMember() {
131+
/* When */
132+
val result = createInstance(MySealedClass.MySealedClassMember::class)
133+
134+
/* Then */
135+
expect(result).toNotBeNull()
136+
}
137+
118138
interface Methods {
119139

120140
fun throwableClass(t: ThrowableClass)
121141
}
122142

123143
class ThrowableClass(cause: Throwable) : Throwable(cause)
144+
145+
sealed class MySealedClass {
146+
class MySealedClassMember : MySealedClass()
147+
}
124148
}

0 commit comments

Comments
 (0)