Java 如何在Mockito中测试try-and-catch块?
我在互联网上尝试了很多不同的东西,但是没有发现任何人用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
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)
todoThrow(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));``但是我仍然收到一个存根不匹配的错误trydoThrow(new DuplicateEmailException())。when(userDAO.insert(any(User.class))