我正在使用mockito。我想在调用unmocked方法时抛出RuntimeException
。
有没有办法做到这一点?
答案 0 :(得分:25)
您可以为模拟设置默认答案。所有没有存根的方法都将使用此默认答案。
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
(How does mockito when() invocation work?)之前调用,并且会抛出{{1在模拟进入存根模式之前。
因此,您必须使用RuntimeException
才能实现此目的。
答案 1 :(得分:14)
执行此操作的最佳方法是使用verifyNoMoreInteractions
和ignoreStubs
静态方法。在测试的“行为”部分之后调用这些;如果调用了任何未修改的方法但未经验证,则会出现故障。
verifyNoMoreInteractions(ignoreStubs(myMock));
这在https://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#ignore_stubs_verification进行了描述,但我认为目前的代码示例中包含了错误打印。
答案 2 :(得分:1)
对汤姆的答案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更好的异常消息,因为它指出了调用未存根方法的行。您只需单击堆栈跟踪。
ReturnsSmartNulls首先尝试返回普通值(零,空集合,空字符串等),然后尝试返回SmartNull。如果返回类型为final,则返回纯null。
ReturnsSmartNulls可能是Mockito 4.0.0中的默认返回值策略
答案 3 :(得分:0)
您模拟整个类,结果是所有方法都将返回null。
然后您可以使用doReturn(...)
来更改该行为。同样,您可以使用doThrow(...)
来生成(因为我只记得void
)方法抛出异常。
这会回答你的问题吗?