我有一个DAO-Layer,我想用JUnit测试。测试覆盖率大约为85%,因此几乎每行代码都被覆盖,但SQLException的catch子句除外。我不知道如何为下面的代码片段激发SQLException:
对我来说唯一可以想到的解决方案是使用java反射将最终变量SELECT_ALL_ATTR
的值重置为:SELLLLLECT * FROM ATTRIBUTES;
。我知道我可以通过使用Mock框架轻松测试异常。但我不想仅仅为了异常测试而引入Mock测试,因为其他一切都是用JUnit测试的。
除了java反射之外还有其他方法吗?
答案 0 :(得分:2)
在您的情况下模拟sql异常并不容易,因为所有依赖项都是由dao本身启动的。也许你可以传递一个假连接,它会在某种方法中抛出SqlException?
答案 1 :(得分:2)
答案 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");
}
}