2012-10-08 104 views
1

我想通過模擬DAO來測試EasyMock服務層。 我的DAO類中的一種方法如下所示。EasyMock來測試異常

public BrickStreamUserVO getUserDetails(String userName, String password) 
{ 
BrickStreamUserVO usrObj = null; 

try 
{ 
    String sqlStr = "SELECT * FROM USER_T WHERE USER_NAME LIKE '" + userName + "' 
    AND PASSWORD = '" + password + "'"; 
    usrObj = getJdbcTemplate().queryForObject(sqlStr, new BrickStreamUserMapper()); 

    logger.info("Getting user details...."); 

    if(usrObj==null) 
    throw new UserException("Invalid Login parameters"); 
} 
catch (Exception e) 
{ 
    logger.error(e);   
    throw new UserException("Invalid Login parameters"); 
} 

return usrObj; 
} 

這裏是我的測試代碼

public class BrickStreamServiceImplTest 
{ 
private BrickStreamServiceImpl serviceImpl; 

@Before 
public void buildService() 
{ 
serviceImpl = new BrickStreamServiceImpl(); 
} 

@Test 
public void testGetUserDetails() 
{ 

BrickStreamDaoImpl daoImplMock = createMock(BrickStreamDaoImpl.class); 
expect(daoImplMock.getUserDetails("user", "pwd")). 
     andReturn(new BrickStreamUserVO()); 
replay(daoImplMock); 

serviceImpl.setBrickStreamDao(daoImplMock); 
serviceImpl.getUserDetails("user", "pwd"); 

verify(daoImplMock); 


    } 
} 

如何測試扔UserException的方法,你可以看到,如果usrObj對象爲null,它拋出一個UserException。

回答

1

如果你模擬getUserDetails方法,你將無法測試它的行爲。

您可能想要提取一個方法,在其中執行用戶查詢並對其進行嘲弄。

public BrickStreamUserVO queryForUser(String userName, String password) { 
    String sqlStr = "SELECT * FROM USER_T WHERE USER_NAME LIKE '" + userName + "' 
    AND PASSWORD = '" + password + "'"; 
    return getJdbcTemplate().queryForObject(sqlStr, new BrickStreamUserMapper()); 
} 

public BrickStreamUserVO getUserDetails(String userName, String password) 
{ 
    BrickStreamUserVO usrObj = null; 

    try 
    { 
     usrObj = queryForUser(userName, password); 
     logger.info("Getting user details...."); 

     if(usrObj==null) { 
      throw new UserException("Invalid Login parameters"); 
     } 
    } catch (Exception e) { 
     logger.error(e);   
     throw new UserException("Invalid Login parameters"); 
    } 

    return usrObj; 
} 

在您的測試類:

@Test(expected = UserException.class) 
public void testGetUserDetails() 
{ 
    BrickStreamDaoImpl daoImplMock = createMockBuilder(BrickStreamDaoImpl.class).addMockedMethod("queryForUser").createMock(); 
    expect(daoImplMock.queryForUser("user", "pwd")).andReturn(null); 
    replay(daoImplMock); 

    serviceImpl.setBrickStreamDao(daoImplMock); 
    serviceImpl.getUserDetails("user", "pwd"); 
} 
+0

它確實達到目的,但隨後被複制的方法。我必須使用我的DAO中的所有方法來執行此操作。我的DAO設計有問題。 – Shankar

+1

我傾向於不測試Dao方法,因爲它們只是數據提供者,並且算法太少。 我更喜歡測試帶有商業價值的方法來調用我的Dao。然後我嘲笑Dao方法。 –

+0

我所有的DAO都和這個一樣,我在這裏通過模擬DAO來測試服務層。您的解決方案是正確的,以達到我想要的,但我認爲它的一部分可以在DAO級別進行測試。 – Shankar