gpt4 book ai didi

oracle - 将 "expected"Oracle 异常返回到 Java Groovy/Grails 的最佳方法

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

背景:

在我的 Oracle 数据库中,我有很多可能导致异常的数据库调用。我目前有所有这些的异常处理程序,它们调用一个错误包。长话短说,raise_application_error最终引发,对于预期错误,或 raise用于意外错误,并将其发送回调用 Java Groovy/Grails 应用程序层。

因此,例如,如果用户输入一个 id 并单击搜索,我会从数据库中运行一个选择查询。如果 id 不存在,我有一个 NO_DATA_FOUND执行 raise_application_error 的异常带有自定义错误消息(即“找不到输入的 ID。”)

但是,应用程序开发团队表示他们正在为此苦苦挣扎。他们试图在 Groovy 中执行单元测试,并且理想情况下希望返回一个变量。我当前返回的 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)

但这意味着所有返回的 SQLExceptions 都会通过,无论它们是否是当前问题的正确异常。

问题:

这个问题的最佳解决方案是什么?我被迫从我的异常块中返回变量,而不是 raise_application_errors - 但我非常不愿意这样做,因为我一直被告知这只是一种糟糕的做法。或者,他们可以自己进行更改,但显然不愿意。

下一步是什么?我应该编码以将“预期”错误作为变量返回,而不是异常?例如,如果有人输入了未找到的 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");
}

他们可以随心所欲地升级它。例如,他们可以开发过程“调用 SP 并将异常转换为他们希望的任何内容”并在他们的测试中使用它。但它们不应影响测试之外的应用程序设计。绝不。

关于oracle - 将 "expected"Oracle 异常返回到 Java Groovy/Grails 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28089410/

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