【问题标题】:EasyMock to test exceptionsEasyMock 测试异常
【发布时间】:2012-10-08 03:51:31
【问题描述】:

我正在尝试通过模拟 DAO 来使用 EasyMock 测试服务层。 我的 DAO 类中的一种方法如下所示。

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。

【问题讨论】:

    标签: dao easymock


    【解决方案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");
    }
    

    【讨论】:

    • 它确实起到了作用,但它正在复制方法。我必须使用我的 DAO 中的所有方法来执行此操作。我的 DAO 设计有问题。
    • 我倾向于不测试 Dao 方法,因为它们只是数据提供者,算法太少。我更喜欢调用我的道来测试具有商业价值的方法。然后我模拟 Dao 方法。
    • 我所有的DAO都和这个差不多,我在这里通过模拟DAO来测试服务层。您的解决方案可以实现我想要的,但我认为其中的一部分可以在 DAO 级别进行测试。
    • @SamyAmirou 在处理通常需要添加 try/catch 或 throws 的方法时,您是否需要为 Java 做任何事情以免在语法上大喊大叫?我有类似的问题,但我一直需要围绕我“期望”抛出错误的内容添加一个 try catch,但我不知道如何处理。
    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多