gpt4 book ai didi

java - 如何模拟junit覆盖率的异常?

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:33 27 4
gpt4 key购买 nike

我有一个导致异常的类。我想要的是模拟该异常,但有了覆盖范围(因此需要 spy ),我如何使用mockito进行模拟,以便Junit覆盖范围能够将这些异常计算为覆盖范围?

例如:

    private List<Data> _getSomeData(Key key) {
log.debug(logPrefix + " GetSomeData");
Connection dbc = null;
PreparedStatement st = null;
ResultSet rs = null;
String q = null;
....
try {
dbc = DataSourceUtils.getConnection(dataSource);
dbc.setAutoCommit(false);
q = "SELECT value FROM table where x = ? and y = ? and z = ?";

st = dbc.prepareStatement(q);
int ix = 1;
st.setInt(ix++, key.x);
st.setInt(ix++, key.y);
st.setInt(ix++, key.z);
rs = st.executeQuery();
while (rs.next()) {
Data data=new Data();
key.id = rs.getLong("x");
key.y = y;
....
DataList.add(data);
}
} catch (Exception e) {
throw new DbException(e, q);
} finally {
DbUtil.cleanup(log, rs, st, dbc);
}
return dataList;
}

所以从上面我想要的是覆盖异常。我如何用覆盖范围覆盖它?

朱测试->

    @Test
public void testException(){
// DataImpl dataDao = new DataImpl();
// dataDao.setLog(new LogImpl());
DataImpl dataDao = Mockito.spy(new DataImpl());
Key key= new Key();
key.x = 1;
key.y = 1;
key.z = 1;
String q =
" SELECT data.* \n" +
" FROM SOME_DATA d1\n" +
" WHERE\n "+
" d1.x = ? \n " +
" AND ROUND (d1.y/ 1000 - 1) = ? \n" +
" AND MOD (d1.z, 1000) = ?";
Mockito.doThrow(new DbException(null, q)).when(invPPNDataDao)._getSomeData(Key);
}

以上可以工作,但不会被覆盖。

最佳答案

这里你需要做的是依赖注入(inject)。然后您可以模拟它并定义它的行为方式。目前,您正在方法中构造大量对象(DataSourceUtils.getConnection(dataSource)new Data()...),这些对象很难测试。

您可以创建类DbcProvider:

public class DbcProvider {

public Connection newDbc() {
DataSourceUtils.getConnection(dataSource);
}

}

然后在测试中模拟 DbcProvider 并将其设置为在调用 newDbc 时抛出异常,然后调用方法 _getSomeData

关于java - 如何模拟junit覆盖率的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33741109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com