我在测试模式中定义了以下简单过程_test_jdbc_inconsistency
,在我的开发系统上的 MySQL 实例中
CREATE PROCEDURE _test_jdbc_inconsistency.proc(IN param1 boolean, OUT param2 boolean)
BEGIN
IF (param1 IS NULL)
THEN
SET param2 = NULL;
ELSE
set param2 = not param1;
END IF;
END
但令我惊讶的是,以下简单的测试失败了
@Test(dataProvider = "connectionPool")
public void testJdbcInconsitencyOutParameterType(Connection con) throws SQLException, IOException
{
con.setCatalog("_test_jdbc_inconsistency");
try (CallableStatement statement = con.prepareCall("{call proc(?, ?)}"))
{
statement.setInt("param1", 5);
statement.registerOutParameter("param2", Types.INTEGER);
statement.execute();
assertTrue(statement.getObject(2) instanceof Integer);
assertEquals(statement.getObject(2), 25);
assertTrue(statement.getObject("param2") instanceof Integer);
}
}
不一致在最后一条assertTrue
语句上被标记;在调用CallableStatement.getObject
接受参数索引的重载返回预期类型 ( java.lang.Integer
) 的结果时,另一个接受参数名称的重载返回类型不一致的结果java.lang.Long
。由于我使用有符号整数并基于许多关于使用JDBC使用out 参数的说明,特别是MySQL 文档提供的那个,因此该过程似乎是正确的,这看起来像是一种不一致的行为。
其他人可以确认这个问题吗?
我的环境:
- 视窗 8.1 x64
- JDK 1.8.0_45 (x64/x86)
- MySQL 连接器/J 5.1.34
- MySQL 服务器 5.6.24
- 测试NG 6.9.5