gpt4 book ai didi

java - 模拟 Oracle CallableStatement.getCursor()

转载 作者:行者123 更新时间:2023-12-01 10:06:42 25 4
gpt4 key购买 nike

我正在处理 Oracle 10g 数据库,并提供了以下存储过程:

 procedure get_synopsis (
p_id in my_schema.products.p_id%type,
p_synopses out sys_refcursor); -- cursor of - synopsis_type, synopsis_text

在我的 Java 代码中,我以这种方式准备语句:

String idForDb = fromIdUrlToIdDb(prodIdUrl); 
statement.registerOutParameter(1, OracleTypes.VARCHAR);
statement.setString(1, idForDb );
statement.registerOutParameter(2, OracleTypes.CURSOR);

我通过这种方式获取我需要的数据:

String defaultSyn, nonDefSyn;

String returnedId = ((OracleCallableStatement)stm).getString(1);
try ( ResultSet synopses = ((OracleCallableStatement)stm).getCursor(2) ){ // p_synopses - cursor of: synopsis_type, synopsis_text

while( synopses!=null && synopses.next() ){

String type = synopses.getString(1) != null ? synopses.getString(1).toUpperCase() : null;

if( type != null ){

StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader( synopses.getClob(2).getCharacterStream() );
String line;

while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}

if("DEFAULT".equals(type)){
defaultSyn = sb.toString();
}else if("NONDEFAULT".equals(type)){
nonDefSyn = sb.toString();
}

// ...
}
}
}

在我的测试中如何模拟(OracleCallableStatement)stm.getCursor(2)

我正在尝试使用 org.jmock.Mockery 但没有成功:

Mockery mockery_inner = new Mockery();
final ResultSet mocked_resultset = mockery_inner.mock(ResultSet.class);
mockery_inner.checking(new Expectations() {{
allowing(mocked_resultset).getString(1); will(returnValue("TEST_SYNOPSES-TYPE"));
allowing(mocked_resultset).getClob(2); will(returnValue("TEST_CLOooooooB"));
}});

Mockery mockery = new Mockery();
final CallableStatement statement = mockery.mock(CallableStatement.class);

mockery.checking(new Expectations() {{
allowing(statement).getString(1); will(returnValue("TEST_RETURNED-PROD-ID"));
allowing(statement).getCursor(2); will(returnValue(mocked_resultset)); // cannot find symbol getCursor(int). Location: interface java.sql.CallableStatement
}});

原因显然是:找不到符号 getCursor(int)。位置:接口(interface)java.sql.CallableStatement.

如果我尝试 allowing((OracleCallableStatement)statement).getCursor(2) 我得到“java.lang.ClassCastException: com.sun.proxy.$Proxy6 无法转换为 oracle.jdbc。驱动程序.OracleCallableStatement”。注意:OracleCallableStatement 不是一个接口(interface),因此不能用 Mockery 进行模拟。

我正在尝试使用“手动”模拟,但在创建实例时遇到问题..

class MockOracleCallableStatement implements OracleCallableStatement {

ResultSet mocked_resultset;

public MockOracleCallableStatement(){

Mockery mockery_inner = new Mockery();
mocked_resultset = mockery_inner.mock(ResultSet.class);
mockery_inner.checking(new Expectations() {{
allowing(mocked_resultset).getString(1); will(returnValue("DEFAULT")); // will pick value from an array
allowing(mocked_resultset).getClob(2); will(returnValue("TEST_CLOooooooooooB"));
}});
}

@Override
ResultSet getCursor(int paramIndex) throws SQLException{
return mocked_resultset;
}
@Override
String getString(int paramIndex) throws SQLException{
return "mockedGetString1--test";
}
}

最佳答案

简而言之,不要

模拟 JDBC(以及许多其他东西)是一件愚蠢的事情,不会测试您认为正在测试的东西,但会花费您大量的时间。

您确实应该编写一个实际进入数据库的集成测试。这是验证数据库代码是否正确的唯一方法。如果可以,请使用与生产中完全相同的数据库版本,如果不能使用 H2* 等内存数据库。

我写了一个article for JAX magazine关于这个确切的主题,我们将进行更详细的介绍。

  • 尽管由于兼容性而存在其他问题

关于java - 模拟 Oracle CallableStatement.getCursor(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36399196/

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