Skip to content

Commit c06d37f

Browse files
authored
Merge pull request #64 from nhaarman/fix-simplest-constructor
Improve `easiestConstructor()` to sort by parameters size.
2 parents 855c14b + 18be968 commit c06d37f

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

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

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ fun <T : Any> createInstance(kClass: KClass<T>): T {
5959
kClass.isPrimitive() -> kClass.toDefaultPrimitiveValue()
6060
kClass.isEnum() -> kClass.java.enumConstants.first()
6161
kClass.isArray() -> kClass.toArrayInstance()
62-
kClass.isClassObject() -> kClass.toClassObject()
62+
kClass.isClassObject() -> kClass.toClassObject()
6363
else -> kClass.easiestConstructor().newInstance()
6464
}
6565
}
@@ -68,20 +68,14 @@ fun <T : Any> createInstance(kClass: KClass<T>): T {
6868
* Tries to find the easiest constructor which it can instantiate.
6969
*/
7070
private fun <T : Any> KClass<T>.easiestConstructor(): KFunction<T> {
71-
return constructors.firstOrDefault(
72-
{
73-
it.parameters.filter {
74-
it.type.toString().toLowerCase().contains("array")
75-
}.isEmpty()
76-
},
77-
{
78-
constructors.sortedBy { it.parameters.size }.first()
79-
}
80-
)
71+
return constructors
72+
.sortedBy { it.parameters.size }
73+
.withoutArrayParameters()
74+
.firstOrNull() ?: constructors.sortedBy { it.parameters.size }.first()
8175
}
8276

83-
private fun <T> Collection<T>.firstOrDefault(predicate: (T) -> Boolean, default: () -> T): T {
84-
return firstOrNull(predicate) ?: default()
77+
private fun <T> List<KFunction<T>>.withoutArrayParameters() = filter {
78+
it.parameters.filter { parameter -> parameter.type.toString().toLowerCase().contains("array") }.isEmpty()
8579
}
8680

8781
@Suppress("SENSELESS_COMPARISON")

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,15 @@ class CreateInstanceTest {
424424
}
425425
}
426426

427+
@Test
428+
fun defaultEmptyConstructor_takesSimplestConstructor() {
429+
/* When */
430+
val result = createInstance(WithDefaultEmptyConstructor::class)
431+
432+
/* Then */
433+
expect(result).toNotBeNull()
434+
}
435+
427436
private class PrivateClass private constructor(val data: String)
428437

429438
class ClosedClass
@@ -459,5 +468,9 @@ class CreateInstanceTest {
459468
}
460469
}
461470

471+
class WithDefaultEmptyConstructor() {
472+
constructor(c: ForbiddenConstructor) : this()
473+
}
474+
462475
enum class MyEnum { VALUE, ANOTHER_VALUE }
463476
}

0 commit comments

Comments
 (0)