Java 如何在Mockito中测试try-and-catch块?

Java 如何在Mockito中测试try-and-catch块?,java,mockito,Java,Mockito,我在互联网上尝试了很多不同的东西,但是没有发现任何人用Mockito处理try-and-catch块时出现异常。 下面是我要测试的代码: public void add() throws IOException { try { userDAO.insert(user); externalContext.redirect("users.xhtml"); } catch (final Duplicat

我在互联网上尝试了很多不同的东西,但是没有发现任何人用Mockito处理try-and-catch块时出现异常。 下面是我要测试的代码:

public void add() throws IOException {
        try {
            userDAO.insert(user);
            externalContext.redirect("users.xhtml");
        } catch (final DuplicateEmailException e) {
            final FacesMessage msg = new FacesMessage(
                    "Die E-Mail Adresse wird bereits verwendet.");
            facesContext.addMessage(emailInput.getClientId(), msg);
        } catch (final UserAlreadyInsertedException e) {
            throw new IllegalStateException(e);
        }
    }
下面是我现在如何测试它的:

@Test
    public void addTest() throws IOException, UserAlreadyInsertedException, DuplicateEmailException {
        User user = mock(User.class);
        doNothing().when(userDAO).insert(user);
        doNothing().when(externalContext).redirect(anyString());
        doNothing().when(facesContext).addMessage(anyString(),any());
        try{
            initMirror();
            userAddBean.add();
            verify(userDAO, times(1)).insert(user);
            verify(externalContext, times(1)).redirect(anyString());
        }
        catch (DuplicateEmailException e){
            verify(facesContext,times(1)).addMessage(anyString(),any());
        }
        catch (UserAlreadyInsertedException e){
            doThrow(IllegalStateException.class);
        }

    }
我很确定,特别是在最后一部分,我试图捕捉并抛出一个异常是错误的,但我真的找不到关于这个的好教程


提前感谢您的帮助:)

您需要为
DuplicateEmailException
UserAlreadyInsertedException
编写单独的测试用例
如果您有一个测试用例用于正面场景,那就太好了。

DuplicateEmailException

@Test
public void addTestForDuplicateEmailException() throws IOException, UserAlreadyInsertedException, DuplicateEmailException {
    User user = mock(User.class);
    doNothing().when(externalContext).redirect(anyString());
    doNothing().when(facesContext).addMessage(anyString(),any());
        
    Mockito.when(userDAO.insert(Mockito.any(User.class))).thenThrow(new DuplicateEmailException());
       
    initMirror();
    userAddBean.add();
    verify(userDAO, times(1)).insert(user);
    verify(externalContext, times(1)).redirect(anyString());   
}
@Test
public void addTestForUserAlreadyInsertedException() throws IOException, UserAlreadyInsertedException, DuplicateEmailException {
    User user = mock(User.class);
    doNothing().when(externalContext).redirect(anyString());
    doNothing().when(facesContext).addMessage(anyString(),any());
        
    Mockito.when(userDAO.insert(Mockito.any(User.class))).thenThrow(new UserAlreadyInsertedException());
       
    initMirror();
    userAddBean.add();
    verify(userDAO, times(1)).insert(user);
    verify(externalContext, times(0)).redirect(anyString());   
}
UserAlreadyInsertedException的第二次测试

@Test
public void addTestForDuplicateEmailException() throws IOException, UserAlreadyInsertedException, DuplicateEmailException {
    User user = mock(User.class);
    doNothing().when(externalContext).redirect(anyString());
    doNothing().when(facesContext).addMessage(anyString(),any());
        
    Mockito.when(userDAO.insert(Mockito.any(User.class))).thenThrow(new DuplicateEmailException());
       
    initMirror();
    userAddBean.add();
    verify(userDAO, times(1)).insert(user);
    verify(externalContext, times(1)).redirect(anyString());   
}
@Test
public void addTestForUserAlreadyInsertedException() throws IOException, UserAlreadyInsertedException, DuplicateEmailException {
    User user = mock(User.class);
    doNothing().when(externalContext).redirect(anyString());
    doNothing().when(facesContext).addMessage(anyString(),any());
        
    Mockito.when(userDAO.insert(Mockito.any(User.class))).thenThrow(new UserAlreadyInsertedException());
       
    initMirror();
    userAddBean.add();
    verify(userDAO, times(1)).insert(user);
    verify(externalContext, times(0)).redirect(anyString());   
}

尝试更改
doNothing().when(userDAO).insert(user)
to
doThrow(newduplicateEmailException()).when(userDAO.insert(user)您似乎想要测试几个不同的执行流(这是一件好事);每种不同的测试方法应采用单独的测试方法。一般来说,你至少会有一个“快乐”的测试方法(没有例外),然后你会有一些方法,比如说
when(stuff)。然后抛出(anException)
,并确保你在
facesContext
中得到一条消息。好的,谢谢你的回答,但是我有void方法,所以不是这样:``Mockito.when>(userDAO.insert(Mockito.any(User.class)))。然后抛出(new UserAlreadyInsertedException());“``我试过:`` doThrow(illegalstateeption.class).when(userDAO.insert(any(User.class));``但是我仍然收到一个存根不匹配的错误try
doThrow(new DuplicateEmailException())。when(userDAO.insert(any(User.class))