2012-10-08 4 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; 
} 

그리고 여기에 내가 왜냐하면 userexecption을 던지는 방법을 테스트 할 수 있습니다 어떻게 내 테스트 코드

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); 


    } 
} 

, 당신은 usrObj 객체가 null의 경우, 그것은 왜냐하면 userexecption을 던져 볼 수 있습니다.

답변

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를 호출하는 비즈니스 가치를 가진 메소드를 테스트하는 것을 선호합니다. 나는 Dao 방법을 조롱한다. –

+0

내 모든 DAO는이 것과 거의 같습니다. DAO를 조롱하여 서비스 계층을 테스트하고 있습니다. 귀하의 솔루션은 내가 원하는 것을 달성하는 것이 맞지만 DAO 레벨에서 그 부분을 테스트 할 수 있다고 생각합니다. – Shankar

관련 문제