调用unmocked方法时抛出RuntimeException

时间:2013-04-05 13:02:14

标签: java mockito

我正在使用mockito。我想在调用unmocked方法时抛出RuntimeException。 有没有办法做到这一点?

4 个答案:

答案 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此功能,因为该方法在whenHow does mockito when() invocation work?)之前调用,并且会抛出{{1在模拟进入存根模式之前。

因此,您必须使用RuntimeException才能实现此目的。

答案 1 :(得分:14)

执行此操作的最佳方法是使用verifyNoMoreInteractionsignoreStubs静态方法。在测试的“行为”部分之后调用这些;如果调用了任何未修改的方法但未经验证,则会出现故障。

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)方法抛出异常。

这会回答你的问题吗?