5

I have the below interface

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

which then I 'm trying to mock so I can test the behaviour of the class that will call it:

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

But the compiler tells me that there is an unhandled exception. The definition of the Retrieve method is:

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

The mockito documentation only shows uses of RuntimeException, and I have not seen anything on similar on StackOverflow. I'm using Java 1.7u25 and mockito 1.9.5

4

3 回答 3

5

假设您的测试方法没有声明它 throws Exception,编译器绝对正确。这一行:

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

...调用Execute. Interface1那可以 throw Exception,所以你要么需要抓住它,要么声明你的方法会抛出它。

我个人建议只声明测试方法 throws Exception。没有其他东西会关心那个声明,你真的不想抓住它。

于 2013-07-06T20:23:08.510 回答
1

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

Mockito.doAnswer(
          invocation -> {
            throw new Exception("It's not bad, it's good");
          })
      .when(interfaceMocked)
      .Execute(org.mockito.ArgumentMatchers.anyString());
于 2019-03-26T07:32:19.260 回答
0

如果你的方法返回一些东西并抛出你的错误,你不应该有问题。现在,如果您的方法返回 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 方法并确保它返回正确的东西。如果您需要确保您的接口抛出异常,那么这是对您的接口类的不同测试。

您必须为单行创建一个方法似乎很糟糕,但如果您想要可测试的代码,有时会发生这种情况。

于 2014-12-04T23:41:02.117 回答