2013-11-24 34 views
1
public boolean changePassword(User user, String newpass) { 
    user.setPasswordHash(newpass); 
    if(update(user) == false) 
     return false; 
    return true; 
} 

public boolean update(User user){ 
    SqlSession session = factory.openSession() 
    try { 
     UserMapper mapper = session.getMapper(UserMapper.class); 
      mapper.update(user); 
      session.commit(); 
      return true; 
     }catch (Exception e){ 
      e.getMessage(); 
      return false; 
     } 
     finally { 
      session.close(); 
     } 
} 

现在这是我的一个test.it是当改变Pasword成功。我如何测试更新方法使用Junit

@Test 
public void shouldChangeUserPasswordWhenAsked() { 
    User updatedUser = new User(); 
    updatedUser.setUserName("user"); 
    updatedUser.setPasswordHash("newpassword"); 
    when(userMapper.findByUsername("user")).thenReturn(updatedUser); 

    Boolean updateResult = userService.password(user,"newpassword"); 
    verify(userMapper).update(user); 
    assertEquals("updatedUserSuccess",userService.getByUsername(user.getUserName()).getPasswordHash(),"newpassword"); 
    assertEquals("updatedSuccess",updateResult,true); 
} 

现在我想如何测试失败的情况,我该怎么办呢?我应该更改我的更新方法吗?测试之前,我嘲笑dabase和一些方法依赖于数据库这样

@Before 
public void setup(){ 
    session = mock(SqlSession.class); 
    userMapper = mock(UserMapper.class); 
    userRoleMapper = mock(UserRoleMapper.class); 

    sessionFactory = mock(SqlSessionFactory.class); 

    when(sessionFactory.openSession()).thenReturn(session); 
    when(session.getMapper(UserMapper.class)).thenReturn(userMapper); 
    when(session.getMapper(UserRoleMapper.class)).thenReturn(userRoleMapper); 

    userService = new UserServiceImpl(sessionFactory); 

    user = new User(); 
    user.setUserName("user"); 
    user.setPasswordHash("password"); 
} 
+0

我不会更改生产代码以获得测试运行... –

回答

2

告诉你的嘲弄之一抛出一个异常调用时:

when(userRoleMapper.update(user)).thenThrow(new RuntimeException("test exception")); 

或者,如果update()方法返回void

doThrow(new RuntimeException("test exception")).when(userRoleMapper).update(user); 

Mockito有一个very good documentation。阅读。

请注意,捕获异常是一种非常糟糕的做法,您的方法应该让异常冒泡而不是捕获它们并返回false。