1

DAO をモックしてサービス層を EasyMock でテストしようとしています。私の DAO クラスのメソッドの 1 つを以下に示します。

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 がスローされることがわかります。

4

1 に答える 1

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");
}
于 2012-10-08T08:53:58.110 に答える