-
Notifications
You must be signed in to change notification settings - Fork 57
/
ReturnsSmartNulls.scala
32 lines (28 loc) · 1.4 KB
/
ReturnsSmartNulls.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package org.mockito
package stubbing
import java.lang.reflect.Modifier.isFinal
import org.mockito.Mockito.{ mock, withSettings }
import org.mockito.internal.debugging.LocationFactory
import org.mockito.internal.exceptions.Reporter.smartNullPointerException
import org.mockito.internal.stubbing.defaultanswers.ReturnsMoreEmptyValues
import org.mockito.internal.util.ObjectMethodsGuru.isToStringMethod
import org.mockito.invocation.{ InvocationOnMock, Location }
object ReturnsSmartNulls extends DefaultAnswer {
val delegate = new ReturnsMoreEmptyValues
override def apply(invocation: InvocationOnMock): Option[Any] =
Option(delegate.answer(invocation)).orElse {
val returnType = invocation.returnType
if (!returnType.isPrimitive && !isFinal(returnType.getModifiers) && classOf[Object] != returnType)
Some(mock(returnType, withSettings.defaultAnswer(ThrowsSmartNullPointer(invocation)).lenient()))
else
None
}
case class ThrowsSmartNullPointer(unstubbedInvocation: InvocationOnMock, location: Location = LocationFactory.create()) extends Answer[AnyRef] {
override def answer(invocation: InvocationOnMock): AnyRef =
if (isToStringMethod(invocation.getMethod))
s"""SmartNull returned by this unstubbed method call on a mock:
|$unstubbedInvocation""".stripMargin
else
throw smartNullPointerException(unstubbedInvocation.toString, location)
}
}