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' 并在他们的测试中使用它。但它们不应影响测试之外的应用程序设计。从来没有。