public class DeviceController {
...
DeviceHandle handle = getHandle(DEV1);
if (handle != DeviceHandle.INVALID) {
retrieveDeviceRecord(handle);
if (record.getStatus() != DEVICE_SUSPENDED) {
closeDevice(handle);
} else {
logger.log("Device suspended. Unable to shut down");
}
} else {
logger.log("Invalid handle");
}
...
}
: 강제로 예외를 일으키는 테스트 케이스를 작성한 후 테스트를 통과하게 코드를 작성하는 방법을 권장한다. 그러면 자연스럽게 try 블록의 트랜잭션 범위부터 구현하게 되므로 범위 내에서 트랜잭션 본질을 유지하기 쉬워진다.
ex) 최하위 호출함수에서 확인 예외를 던진다면
미확인 예외는 컴파일단계에서 확인되지 않기 때문에 명시적으로 처리하지 않아도 된다.
따라서 상위 단계에서 수정이 필요 없다.
(반면, 확인 예외는 컴파일 시점에서 확인되어 반드시 처리해야 한다. 따라서 최하위)
말 그대로.
외부코드를 여기저기 넘기지 말라..!
-> 대안 : 외부코드를 사용하는 클래스를 정의하여 사용하면, 설계 규칙과 비즈니스 규칙을 강제할 수 있다.
곧바로 우리쪽 코드를 작성해 외부 코드를 호출하는 대신
먼저 간단한 테스트 케이스를 작성해 외부코드를 익히면 어떨까?
짐 뉴커크는 이를 학습 테스트라 부른다.
Fast
Independent
Repeatable
Selt-validating
Timely