首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试使用mockito抛出检查异常时出现问题

尝试使用mockito抛出检查异常时出现问题
EN

Stack Overflow用户
提问于 2013-07-07 04:21:10
回答 3查看 9.7K关注 0票数 5

我有下面的界面

代码语言:javascript
运行
复制
public interface Interface1 {
    Object Execute(String commandToExecute) throws Exception;
}

然后我试图模拟它,这样我就可以测试将调用它的类的行为:

代码语言:javascript
运行
复制
Interface1 interfaceMocked = mock(Interface1.class);
when(interfaceMocked.Execute(anyString())).thenThrow(new Exception());
Interface2 objectToTest = new ClassOfInterface2(interfaceMocked);
retrievePrintersMetaData.Retrieve();

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

代码语言:javascript
运行
复制
public List<SomeClass> Retrieve() {
    try {
        interface1Object.Execute("");
    }
    catch (Exception exception) {
        return new ArrayList<SomeClass>();
    }
}

mockito文档只展示了RuntimeException的用法,而我在StackOverflow上还没有看到类似的东西。我使用的是Java 1.7u25和mockito 1.9.5

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-07 04:23:09

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

代码语言:javascript
运行
复制
when(interfaceMocked.Execute(anyString())).thenThrow(new Exception());

..。在Interface1的实例上调用Execute。这会抛出Exception,所以你需要捕捉它或者声明你的方法抛出了它。

我个人建议只声明测试方法抛出Exception。其他任何东西都不会关心这个声明,而且您也不会真的想要捕获它。

票数 5
EN

Stack Overflow用户

发布于 2019-03-26 15:32:19

您可以使用Mockito的doAnswer方法抛出检查过的异常,如下所示

代码语言:javascript
运行
复制
Mockito.doAnswer(
          invocation -> {
            throw new Exception("It's not bad, it's good");
          })
      .when(interfaceMocked)
      .Execute(org.mockito.ArgumentMatchers.anyString());
票数 1
EN

Stack Overflow用户

发布于 2014-12-05 07:41:02

如果你的方法返回一些东西并抛出错误,你应该不会有问题。现在,如果你的方法返回void,你将不能抛出一个错误。

现在真正的问题是,你不是在测试你的接口是否抛出了异常,而是在测试当异常在这个方法中抛出时会发生什么。

代码语言:javascript
运行
复制
public List<SomeClass> Retrieve() {
    try {
        interface1Object.Execute("");
    }
    catch (Exception exception) {
        return handleException(exception);
    }
}

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

然后,您只需调用handleException方法,并确保它返回正确的内容。如果您需要确保您的接口抛出异常,那么对于您的接口类来说,这是一个不同的测试。

你不得不为一行代码创建一个方法,这可能看起来很糟糕,但如果你想要可测试的代码,有时就会发生这种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17506767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档