如何使用JUnit在DAO层中激发SQLExcetpion

时间:2013-07-17 12:53:01

标签: java junit code-coverage dao sqlexception

我有一个DAO-Layer,我想用JUnit测试。测试覆盖率大约为85%,因此几乎每行代码都被覆盖,但SQLException的catch子句除外。我不知道如何为下面的代码片段激发SQLException:

Code coverage report
对我来说唯一可以想到的解决方案是使用java反射将最终变量SELECT_ALL_ATTR的值重置为:SELLLLLECT * FROM ATTRIBUTES;。我知道我可以通过使用Mock框架轻松测试异常。但我不想仅仅为了异常测试而引入Mock测试,因为其他一切都是用JUnit测试的。

除了java反射之外还有其他方法吗?

3 个答案:

答案 0 :(得分:2)

在您的情况下模拟sql异常并不容易,因为所有依赖项都是由dao本身启动的。也许你可以传递一个假连接,它会在某种方法中抛出SqlException?

答案 1 :(得分:2)

我为这个http://melati.org/throwing-jdbc-4.1/index.html

写了一个小工具

答案 2 :(得分:1)

这是模拟库的一个很好的用例。我用mockito。假设您想测试DAO客户端的行为,您只需模拟它:

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import junit.framework.Assert;
import org.junit.Test;
public class MockitoTest {
/** your dao, just putting some code here for an example */ 
class MyDAO {
    public List<SVCAttribute> selectAll(Connection con) throws DAOException {
        try {
            //your code..
        }catch(Exception ex) {
            throw new DAOException();
        }
        return new ArrayList<SVCAttribute>();
    }
}
@Test
public void testMe() throws Exception {
    MyDAO dao = mock(MyDAO.class);
    when(dao.selectAll(any(Connection.class))).thenThrow(DAOException.class);
    Connection con = getConnection();
    try {
        dao.selectAll(con);
        Assert.fail();
    }catch(Exception ex) {
        System.out.println("caught expected excetpion");
    }
}