1

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

代码覆盖率报告
对我来说,唯一可以想到的解决方案是将最终变量的值重置为SELECT_ALL_ATTRSELLLLLECT * FROM ATTRIBUTES;通过使用 java 反射。我知道我可以使用 Mock 框架轻松测试异常。但是我不想仅仅为了异常测试而引入 Mock 测试,因为其他所有东西都是用 JUnit 测试的。

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

4

3 回答 3

2

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

于 2013-07-17T13:06:20.187 回答
2

我为这个http://melati.org/throwing-jdbc-4.1/index.html写了一个小工具

于 2015-06-24T23:36:04.040 回答
1

这是模拟库的一个很好的用例。我用模仿。假设你想测试你的 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");
    }
}
于 2013-07-17T20:00:55.427 回答