我正在使用 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
(模拟when() 调用如何工作?RuntimeException
)并且它会在模拟进入存根模式之前抛出 a 。
因此,您必须使用doReturn
它才能工作。
最好的方法是使用verifyNoMoreInteractions
和ignoreStubs
静态方法。在测试的“行为”部分之后调用它们;如果调用了任何未存根的方法但未验证,您将失败。
verifyNoMoreInteractions(ignoreStubs(myMock));
这在https://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#ignore_stubs_verification进行了描述,尽管我相信那里的代码示例目前包含印刷错误。
完善汤姆的回答https://stackoverflow.com/a/15835255/1484823
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 更好的异常消息,因为它指出了调用未存根方法的行。您只需单击堆栈跟踪。
ReturnsSmartNull 首先尝试返回普通值(零、空集合、空字符串等),然后尝试返回 SmartNull。如果返回类型为 final,则返回纯 null。
ReturnsSmartNulls 可能是 Mockito 4.0.0 中的默认返回值策略
您模拟整个类,结果是所有方法都将返回 null。
然后你可以使用doReturn(...)
来改变这种行为。同样,您可以使用doThrow(...)
to make(我只记得void
)方法抛出异常。
这是否回答你的问题?