繁体   English   中英

尝试使用Mockito引发抛出检查异常的问题

[英]Issues trying throw checked exception with mockito

我有下面的界面

public interface Interface1 {
    Object Execute(String commandToExecute) throws Exception;
}

然后,我尝试进行模拟,以便可以测试将其调用的类的行为:

Interface1 interfaceMocked = mock(Interface1.class);
when(interfaceMocked.Execute(anyString())).thenThrow(new Exception());
Interface2 objectToTest = new ClassOfInterface2(interfaceMocked);
retrievePrintersMetaData.Retrieve();

但是编译器告诉我,有一个未处理的异常。 Retrieve方法的定义是:

public List<SomeClass> Retrieve() {
    try {
        interface1Object.Execute("");
    }
    catch (Exception exception) {
        return new ArrayList<SomeClass>();
    }
}

Mockito文档仅显示RuntimeException的用法,而我在StackOverflow上也没有看到类似内容。 我正在使用Java 1.7u25和Mockito 1.9.5

假设您的测试方法没有声明它抛出Exception ,那么编译器是绝对正确的。 这行:

when(interfaceMocked.Execute(anyString())).thenThrow(new Exception());

...在Interface1的实例上调用Execute 那会抛出Exception ,所以您要么需要捕获它,要么声明您的方法将其抛出。

我个人建议仅声明测试方法抛出Exception 没有别的要关心那个声明了,您真的不想抓住它。

如果您的方法返回一些东西并抛出错误,那么您应该不会有任何问题。 现在,如果您的方法返回void,您将无法引发错误。

现在真正的事实是,您不是要测试接口是否引发异常,而是要测试在此方法中引发异常时会发生什么。

public List<SomeClass> Retrieve() {
    try {
        interface1Object.Execute("");
    }
    catch (Exception exception) {
        return handleException(exception);
    }
}

protected List<SomeClass> handleException(Exception exception) {
     return new ArrayList<SomeClass>();
}

然后,您只需调用handleException方法并确保它返回正确的值即可。 如果需要确保接口引发异常,那么这是对接口类的另一种测试。

您似乎不得不为一行编写一个方法似乎很麻烦,但是如果您需要可测试的代码,有时就会发生这种情况。

您可以使用Mockito的doAnswer方法引发已检查的异常,像这样

Mockito.doAnswer(
          invocation -> {
            throw new Exception("It's not bad, it's good");
          })
      .when(interfaceMocked)
      .Execute(org.mockito.ArgumentMatchers.anyString());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM