我正在使用Mockito。我希望在调用未存根化的方法时抛出RuntimeException
。
有没有什么方法可以做到这一点?
我正在使用Mockito。我希望在调用未存根化的方法时抛出RuntimeException
。
有没有什么方法可以做到这一点?
你可以为模拟设置一个默认答案。所有未进行存根化处理的方法将使用此默认答案。
public void testUnstubbedException() {
// Create a mock with all methods throwing a RuntimeException by default
SomeClass someClass = mock( SomeClass .class, new RuntimeExceptionAnswer() );
doReturn(1).when(someClass).getId(); // Must use doReturn
int id = someClass.getId(); // Will return 1
someClass.unstubbedMethod(); // Will throw RuntimeException
}
public static class RuntimeExceptionAnswer implements Answer<Object> {
public Object answer( InvocationOnMock invocation ) throws Throwable {
throw new RuntimeException ( invocation.getMethod().getName() + " is not stubbed" );
}
}
请注意,您不能在此功能中使用when
,因为该方法在when
之前被调用(Mockito when() invocation work是如何工作的?),并且它将在模拟进入存根模式之前抛出RuntimeException
。
因此,您必须使用doReturn
才能使其正常工作。
doReturn
并进行一些额外的工作,比人们对于这样一个常见的需求所期望的要多。 - Charliewhen
函数重写为doReturn
是一项我不想做的大量重写工作。 - undefined最好的方法是使用verifyNoMoreInteractions
和ignoreStubs
静态方法。在测试的"act"部分之后调用它们; 如果调用了任何未存根的方法但未经验证,则会失败。
verifyNoMoreInteractions(ignoreStubs(myMock));
虽然我认为其中的代码示例当前包含一个错字,但这在https://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#ignore_stubs_verification中有所描述。
verifyNoMoreInteractions
添加到测试用例的末尾无法帮助诊断意外未存根的方法,如果它们在之前引发了空指针异常。Guillaume Berche发表了一个答案,当使用“智能”空值时,提供了一个更有用的失败消息,但在未解引用(智能)空值的情况下无法帮助。在我看来,这两个答案的结合涵盖了所有情况。 - undefined对Tom的回答进行改进https://dev59.com/omUo5IYBdhLWcg3wtRMx#15835255
Mockito现在提供了内置支持,具有默认抛出异常的答案,并且可以使用@Mock注释指定
@Mock(answer = Answers.RETURNS_SMART_NULLS)
private BackingAppDeploymentService backingAppDeploymentService;
或者
private BackingAppDeploymentService backingAppDeploymentService =
Mockito.mock(BackingAppDeploymentService.class, new ReturnsSmartNulls());
查看https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#RETURNS_SMART_NULLS
如果您的代码使用未存根调用返回的对象,则会得到NullPointerException。 Answer的这个实现返回SmartNull而不是null。 SmartNull比NPE提供更好的异常信息,因为它指出了调用未存根方法的行。 您只需单击堆栈跟踪。
ReturnsSmartNulls首先尝试返回普通值(零、空集合、空字符串等),然后尝试返回SmartNull。 如果返回类型是final,则返回普通null。
ReturnsSmartNulls可能是Mockito4.0.0中默认的返回值策略
doReturn(...)
来改变这个行为。同样地,你可以使用 doThrow(...)
使得(据我回忆只有 void
)方法抛出异常。