38

我正在使用 Mockito。我想在RuntimeException调用未存根的方法时抛出一个。

有没有办法做到这一点?

4

4 回答 4

39

您可以为模拟设置默认答案。所有未存根的方法都将使用此默认答案。

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它才能工作。

于 2013-04-05T13:29:37.333 回答
15

最好的方法是使用verifyNoMoreInteractionsignoreStubs静态方法。在测试的“行为”部分之后调用它们;如果调用了任何未存根的方法但未验证,您将失败。

verifyNoMoreInteractions(ignoreStubs(myMock));

这在https://static.javadoc.io/org.mockito/mockito-core/2.8.47/org/mockito/Mockito.html#ignore_stubs_verification进行了描述,尽管我相信那里的代码示例目前包含印刷错误。

于 2013-04-07T04:13:42.243 回答
0

完善汤姆的回答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 中的默认返回值策略

于 2020-03-30T07:28:37.603 回答
-1

您模拟整个类,结果是所有方法都将返回 null。

然后你可以使用doReturn(...)来改变这种行为。同样,您可以使用doThrow(...)to make(我只记得void)方法抛出异常。

这是否回答你的问题?

于 2013-04-05T13:08:34.667 回答