Skip to content

Commit 8f5660a

Browse files
committed
Provide more structured error data in exception
1 parent c357e1c commit 8f5660a

2 files changed

Lines changed: 39 additions & 11 deletions

File tree

lib/src/main/kotlin/io/nexure/capsule/Capsule.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ internal class DependencyException(
110110
) : Exception() {
111111
constructor(clazz: Class<*>, cause: Exception? = null) : this(classKey(clazz), cause)
112112

113-
override val message: String = "Unable to provide dependency for class ${rootKey()}"
114-
fun rootKey(): String = if (this.cause is DependencyException) this.cause.key else this.key
113+
fun children(): List<String> {
114+
val childClasses: List<String> =
115+
if (cause is DependencyException) cause.children() else emptyList()
116+
117+
return listOf(key) + childClasses
118+
}
119+
120+
override val message: String =
121+
"Unable to provide dependency for class, " +
122+
"since no explicit implementation was registered in chain: ${children()}"
115123
}

lib/src/test/kotlin/io/nexure/capsule/CapsuleTest.kt

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -185,24 +185,44 @@ class CapsuleTest {
185185

186186
@Test
187187
fun `DependencyException should provide context on which class creation that failed`() {
188-
class ComplexGreeter(
189-
val string: String,
190-
val double: Double
191-
) : Greeter {
192-
override fun hello(): String = "foo"
188+
try {
189+
val capsule = Capsule {}
190+
capsule.get<GrandParent>()
191+
assertTrue(false)
192+
} catch (e: DependencyException) {
193+
val expected = listOf(
194+
"io.nexure.capsule.GrandParent",
195+
"io.nexure.capsule.Parent",
196+
"io.nexure.capsule.Child",
197+
"double"
198+
)
199+
assertEquals(expected, e.children())
193200
}
201+
}
194202

195-
val capsule = Capsule {}
203+
@Test
204+
fun `DependencyException should provide context on which class creation that failed from first missing class`() {
196205
try {
197-
val g = capsule.get<ComplexGreeter>()
206+
val capsule = Capsule {
207+
GrandParent(get())
208+
}
209+
capsule.get<GrandParent>()
198210
assertTrue(false)
199211
} catch (e: DependencyException) {
200-
assertEquals("double", e.rootKey())
201-
assertEquals("Unable to provide dependency for class double", e.message)
212+
val expected = listOf(
213+
"io.nexure.capsule.Parent",
214+
"io.nexure.capsule.Child",
215+
"double"
216+
)
217+
assertEquals(expected, e.children())
202218
}
203219
}
204220
}
205221

222+
class Child(val double: Double)
223+
class Parent(val child: Child)
224+
class GrandParent(val parent: Parent)
225+
206226
interface Greeter {
207227
fun hello(): String
208228
}

0 commit comments

Comments
 (0)