Java 调用未创建的方法时引发RuntimeException

Java 调用未创建的方法时引发RuntimeException,java,mockito,Java,Mockito,我用的是Mockito。我想在调用未subbed方法时抛出一个RuntimeException 有什么方法可以做到这一点吗?模拟整个类,结果是所有方法都将返回null 然后可以使用doReturn(…)来更改该行为。类似地,您可以使用doThrow(…)来生成(我只记得void)方法抛出异常 这是否回答了您的问题?您可以为模拟设置默认答案。所有没有存根的方法都将使用此默认答案 public void testUnstubbedException() { // Create a mock

我用的是Mockito。我想在调用未subbed方法时抛出一个
RuntimeException


有什么方法可以做到这一点吗?

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

然后可以使用
doReturn(…)
来更改该行为。类似地,您可以使用
doThrow(…)
来生成(我只记得
void
)方法抛出异常


这是否回答了您的问题?

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

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" );
    }

}
public void TestUnsubbedException(){
//创建一个模拟,默认情况下所有方法都会引发RuntimeException
SomeClass SomeClass=mock(SomeClass.class,新的RuntimeExceptionAnswer());
doReturn(1).when(someClass).getId();//必须使用doReturn
int id=someClass.getId();//将返回1
someClass.UnsubbedMethod();//将引发RuntimeException
}
公共静态类RuntimeExceptionAnswer实现应答{
公共对象应答(InvocationMock调用)抛出Throwable{
抛出新的RuntimeException(invocation.getMethod().getName()+“未存根”);
}
}
请注意,不能将
when
与此功能一起使用,因为该方法在
when
()之前调用,并且它将在模拟进入存根模式之前抛出
运行时异常


因此,您必须使用
doReturn
才能工作。

最好的方法是使用
verifynomoreiversations
ignoresubs
静态方法。在你测试的“表演”部分后再调用这些;如果调用了任何未创建的方法但未验证,则会失败

verifyNoMoreInteractions(ignoreStubs(myMock));

虽然我相信那里的代码示例目前包含一个打印错误,但在中对其进行了描述。

对Tom的答案进行了细化

Mockito现在提供了内置的支持,并提供了一个引发异常的默认答案,可以通过@Mock注释指定

    @Mock(answer = Answers.RETURNS_SMART_NULLS)
    private BackingAppDeploymentService backingAppDeploymentService;

如果代码使用未subbed调用返回的对象,则会得到NullPointerException。Answer的此实现返回SmartNull而不是null。SmartNull提供了比NPE更好的异常消息,因为它指出了调用Unsubbed方法的行。您只需单击堆栈跟踪

ReturnsSmartNulls首先尝试返回普通值(零、空集合、空字符串等),然后尝试返回SmartNull。如果返回类型是final,则返回纯null

ReturnsSmartNulls可能是Mockito 4.0.0中的默认返回值策略


你为什么要这样做?在这种情况下,你所说的“未修改的方法”到底是什么意思?当使用
mock(…)
/
@mock
时,类中的所有方法都会被模拟。因为我经常忘记模拟某些方法。异常可以帮助找到这些方法。但是如果我没有处理mock对象的方法,那么这个方法返回null(如果它必须返回object),我想他指的是所有没有被存根的方法。我想他想确保所有方法都被模拟,例如,如果一个方法没有被模拟,Mockito就会抛出异常Yes!但是我想确保所有将被调用的方法都是模拟的。一个模拟类中的所有方法都是模拟的-根据定义。太棒了!我希望,若我并没有处理这个方法(比如'when(mockedObj.getName()).thanReturn(“ebala”)),那个么该方法将在调用它时抛出RuntimeException。谢谢“stubing”这个词),谢谢!但是当我插入'when(someClass.unmpokedMethod()).thanReturn(“huerga”)'时,它会继续抛出异常,您必须使用
doReturn
而不是
when
。我用这个解决方案编辑了我的答案。遗憾的是,这需要
doReturn
和一点额外的工作,这比人们期望的要多。如果您的测试在这一点之前由于调用未经修改的方法而导致空解引用而崩溃,那么这是没有帮助的。
    private BackingAppDeploymentService  backingAppDeploymentService =
      Mockito.mock(BackingAppDeploymentService.class, new ReturnsSmartNulls());