使用Mockito,如何使用返回类型void存储一个方法,该方法在传递某个参数时会抛出异常?

rmo*_*stl 5 java junit unit-testing mockito

以下是使用异常void方法进行存根的主要Mockito文档.但是,Mockito doc中的示例存根无参数方法.如果方法具有参数并且如果a参数不符合合同,则该方法抛出异常,该怎么办?

所以对于下面的课程......

public class UserAccountManager {    
   /**
    * @throws Exception if user with provided username already exists
    */
    public void createAccount(User user) throws Exception {
        // db access code ...
    }
}
Run Code Online (Sandbox Code Playgroud)

...如何使用Mockito模拟UserAccountManager.createAccount,以便在某个User对象作为参数传递给方法时抛出异常

rmo*_*stl 10

所述的Mockito文档已经示出了如何存根的示例性参数的例外空隙方法.

但是,对于使用参数和异常对void方法进行存根,请执行以下操作:

由于createAccount返回类型为void,因此必须使用doThrow:

User existingUser = ... // Construct a user which is supposed to exist
UserAccountManager accountMng = mock(UserAccountManager.class);    

doThrow(new Exception()).when(accountMng).createAccount(eq(existingUser));
Run Code Online (Sandbox Code Playgroud)

注意eq Matcher 的用法.如果参数的类型(在本例中为User)不能单独实现equals,您也可以尝试使用refEq Matcher.