return "expected" Oracle 异常 Java Groovy/Grails 的最佳方法
Best way to return "expected" Oracle exceptions to Java Groovy/Grails
背景:
在我的 Oracle 数据库中,我有很多可能导致异常的数据库调用。我目前有所有这些的异常处理程序,它调用错误包。长话短说,最终会针对预期错误引发 raise_application_error
,或针对意外错误引发 raise
,并将其发送回调用方 Java Groovy/Grails应用层。
因此,例如,如果用户输入一个 ID 并单击搜索,我 运行 从数据库中进行 select 查询。如果 id 不存在,我有一个 NO_DATA_FOUND
异常,它执行带有自定义错误消息的 raise_application_error
(即 "ID entered cannot be found.")
但是,应用程序开发团队表示他们正在努力解决这个问题。他们正在尝试在 Groovy 中执行单元测试,理想情况下需要一个变量 returned。我目前 returning 的 SQL 异常导致所有测试失败,因为它是一个异常。他们的代码如下所示:
void nameOfProcedure() {
String result = storedProcedure.callDBProcedure(ConnectionType.MSSQL, val1, val2)
log.info "SQL Procedure query result value: "+ result
assertEquals("1", result)
}
他们可以在测试上方添加类似这样的内容:
@Test (expected = SQLException.class)
但这意味着所有 returning SQL异常都会通过,无论它们是否是手头问题的正确异常。
问题:
这个问题的最佳解决方案是什么?我被迫从我的异常块中获取 return 变量,而不是 raise_application_errors - 但我非常不愿意这样做,因为我一直被告知这是一种非常糟糕的做法。或者,他们可以自己做出改变,但显然不愿意。
下一步是什么?我应该将 return "expected" 错误编码为变量,而不是异常吗?例如,如果有人输入了一个未找到的 ID:
BEGIN
SELECT id
FROM table
WHERE id = entered_id
EXCEPTION
WHEN NO DATA FOUND THEN
RETURN 'ID cannot be found';
END
或者,他们是否应该遵循指南 like this,该指南建议使用 Hamcrest 匹配器来创建他们自己的自定义异常 属性,他们可以在 JUnit 测试中检查这些异常。这里的最佳做法是什么?
你说得对,这是糟糕的做法。它只是'wagging the dog';他们懒得好好工作,希望您破坏应用程序设计以取悦他们。
通常,返回异常的单元测试应该如下所示:
try {
String result = callDBProcedure();
fail("Result instead of exception");}
catch (OracleSQLException e) {
assertEquals(e.errorCode, RAISE_APPLICATION_ERROR_CODE);}
catch (Throwable t) {
fail("Unexpected error");
}
他们可以随意升级。例如,他们可以开发过程 'call the SP and convert exception to anything they wish' 并在他们的测试中使用它。但它们不应影响测试之外的应用程序设计。从来没有。
背景:
在我的 Oracle 数据库中,我有很多可能导致异常的数据库调用。我目前有所有这些的异常处理程序,它调用错误包。长话短说,最终会针对预期错误引发 raise_application_error
,或针对意外错误引发 raise
,并将其发送回调用方 Java Groovy/Grails应用层。
因此,例如,如果用户输入一个 ID 并单击搜索,我 运行 从数据库中进行 select 查询。如果 id 不存在,我有一个 NO_DATA_FOUND
异常,它执行带有自定义错误消息的 raise_application_error
(即 "ID entered cannot be found.")
但是,应用程序开发团队表示他们正在努力解决这个问题。他们正在尝试在 Groovy 中执行单元测试,理想情况下需要一个变量 returned。我目前 returning 的 SQL 异常导致所有测试失败,因为它是一个异常。他们的代码如下所示:
void nameOfProcedure() {
String result = storedProcedure.callDBProcedure(ConnectionType.MSSQL, val1, val2)
log.info "SQL Procedure query result value: "+ result
assertEquals("1", result)
}
他们可以在测试上方添加类似这样的内容:
@Test (expected = SQLException.class)
但这意味着所有 returning SQL异常都会通过,无论它们是否是手头问题的正确异常。
问题:
这个问题的最佳解决方案是什么?我被迫从我的异常块中获取 return 变量,而不是 raise_application_errors - 但我非常不愿意这样做,因为我一直被告知这是一种非常糟糕的做法。或者,他们可以自己做出改变,但显然不愿意。
下一步是什么?我应该将 return "expected" 错误编码为变量,而不是异常吗?例如,如果有人输入了一个未找到的 ID:
BEGIN
SELECT id
FROM table
WHERE id = entered_id
EXCEPTION
WHEN NO DATA FOUND THEN
RETURN 'ID cannot be found';
END
或者,他们是否应该遵循指南 like this,该指南建议使用 Hamcrest 匹配器来创建他们自己的自定义异常 属性,他们可以在 JUnit 测试中检查这些异常。这里的最佳做法是什么?
你说得对,这是糟糕的做法。它只是'wagging the dog';他们懒得好好工作,希望您破坏应用程序设计以取悦他们。
通常,返回异常的单元测试应该如下所示:
try {
String result = callDBProcedure();
fail("Result instead of exception");}
catch (OracleSQLException e) {
assertEquals(e.errorCode, RAISE_APPLICATION_ERROR_CODE);}
catch (Throwable t) {
fail("Unexpected error");
}
他们可以随意升级。例如,他们可以开发过程 'call the SP and convert exception to anything they wish' 并在他们的测试中使用它。但它们不应影响测试之外的应用程序设计。从来没有。