4

배경에 대한 예외 반환 : 내 Oracle 데이터베이스에서가장 좋은 방법은 "예상"오라클의 자바 멋져요/Grails의

을, 나는 예외를 일으킬 수 있습니다 데이터베이스 호출의 많음이있다. 현재 오류 패키지를 호출하는 모든 예외 처리기가 있습니다. 긴 이야기를 짧게 줄이려면 결국 예상 오류 때문에 raise_application_error이 발생하고 예기치 않은 오류가 발생하면 raise가 발생하고 호출 Java Groovy/Grails 응용 프로그램 계층으로 다시 전송됩니다.

예를 들어, 사용자가 ID를 입력하고 검색을 클릭하면 데이터베이스에서 선택 쿼리를 실행합니다. ID가없는 경우 raise_application_error 사용자 지정 오류 메시지 (예 : "입력 한 ID를 찾을 수 없습니다.")를 수행하는 NO_DATA_FOUND 예외가 있습니다.

그러나 응용 프로그램 개발 팀은이 문제로 어려움을 겪고 있다고 말합니다 . 그들은 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) 

하지만이 모든 반환 된 SQLException 상관없이이 문제에 대한 올바른 예외 여부, 통과 의미 손에.

질문 :

이 문제에 대한 가장 좋은 방법은 무엇입니까? raise_application_errors보다는 내 예외 블록에서 변수를 반환해야한다는 압박을 받고 있습니다. 그러나 저는 이것이 항상 단순한 끔찍한 습관이라고 말했기 때문에 이것을하는 것을 매우 꺼립니다. 양자 택일로, 그들은 그들의 끝에 변화를 만들 수 있습니다. 그러나 분명히 꺼려합니다.

다음 단계는 무엇입니까? 예외가 아닌 "예상 된"오류를 변수로 반환하도록 코딩해야합니까? 그들은 Hamcrest 그들이에 대해 확인할 수 있습니다 자신의 사용자 정의 예외 속성을 만들 정합 사용하여 조언 가이드 like this 다음해야

BEGIN 
    SELECT id 
    FROM table 
    WHERE id = entered_id 
EXCEPTION 
WHEN NO DATA FOUND THEN 
    RETURN 'ID cannot be found'; 
END 

을 또는 대안 : 누군가가 ID를 입력하면 예를 들어, 발견되지 않도록 그들의 JUnit 테스트. 가장 좋은 방법은 무엇입니까?

답변

0

네 말이 맞아, 끔찍한 연습이야. 단지 '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를 호출하고 예외를 원하는 것으로 변환하는'절차를 개발하여 테스트에 사용할 수 있습니다. 그러나 테스트 외부의 응용 프로그램 디자인에는 영향을 미치지 않아야합니다. 못.

+0

나는 순수 자바 코딩에서 잘못된 패스워드를 예외로 입력하는 것과 같은 것을 잡는 것은 나쁜 습관이라고 생각한다. 그러나 오라클과 스토어드 프로 시저가 관련 될 때, 분명히 갈 길이라고 생각합니다. 당신의 대답은 제가 그들이 할 수 있다고 생각했던 것과 정확하게 같습니다. –

+0

Btw, ExpectedException 링크에 감사드립니다.나는이 시설에 대해 몰랐다. 그것은 매우 좋으며, 그들에게 맞는 방법을 보여줍니다. –