문제

나는 내가 다루려고하는 ioexception 캐치가있는 코드에 대한 테스트를 작성하고 있습니다. 시도/캐치는 다음과 같습니다.

try {
    oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
} catch (IOException e) {
    LOGGER.error("Bad news!", e);
} finally {

가장 쉬운 방법은 FileOutputStream이 filenotFoundException을 던지는 것처럼 보이지만 아마도 나는 이것을 잘못 생각하고있을 것입니다.

팁이있는 사람이 있습니까?

도움이 되었습니까?

해결책

귀하의 의견에서 :

예, 질문은 실제로 "Linux와 Windows에 존재하지 않는 파일을 어떻게 만들 수 있습니까?"라고 생각합니다. Windows에서는 '새 파일 ( "x :/")을 사용할 수 있습니다. 여기서 x :는 존재하지 않는 드라이브 문자입니다. Linux에서는 유효한 파일 이름이기 때문에 작동하지 않습니다.

java.io.file.createtempfile을 참조하십시오. 이를 사용하여 파일을 작성한 다음 삭제하십시오.

아마도 다음과 같은 것을 전달할 것입니다.

File tempFile;

tempFile = createTempFile(getClass().getName(), 
                          Long.toString(System.currentTimeMillis());
tempFile.delete();

그것은 당신에게 기존에 대한 두려움없이 안전하게 사용할 수있는 플랫폼 지거 방식으로 독특한 이름을 제공해야합니다.

다른 팁

당신은 설정할 수 있습니다 cacheFileName 유효하지 않은 이름이나 아는 이름은 존재하지 않습니다.

모든 테스트에는 두 가지 부분이 있습니다. 발생하고 올바른 결과를 얻었음을 측정합니다.

결함 주입

가장 쉬운 대답은 이미 언급 된 대답입니다. cacheFileName 존재하지 않을 파일에. 이것은이 상황에서 가장 실용적인 답변 일 것입니다.

그러나 IOException, 당신이 정말로 원하는 것은입니다 결함 주입. 이는 소스 코드를 계측하도록 강요하지 않고 코드의 결함을 강요합니다. 다음은 몇 가지 방법입니다.

  • 모의 개체 공장 방법을 사용하여 재정의를 만들 수 있습니다. ObjectOutputStream 또는 FileOutputStream. 테스트 코드에서 구현은 an을 던질 것입니다 IOException 당신이 원했고 생산 코드에서는 정상적인 행동을 수정하지 않을 것입니다.
  • 의존성 주입 올바른 장소에 모의 물체를 가져 오려면 다음과 같은 프레임 워크를 사용할 수 있습니다. 또는 이음매 작업을 수행하는 수업에 적절한 개체를 "주입"하려면. 이러한 프레임 워크는 주입 될 객체에 우선 순위가있어서 단위 테스트 중에 테스트 개체로 생산 객체를 무시할 수 있습니다.
  • 측면 지향 프로그래밍 코드 구조를 전혀 변경하는 대신 AOP를 사용하여 올바른 위치에 결함을 주입 할 수 있습니다. 예를 들어, 사용 종자 당신은 a를 정의 할 수 있습니다 포인트 컷 당신이 예외를 버리고 싶어하는 곳에서 조언 원하는 예외를 던지십시오.

Java의 결함 주입에 대한 다른 답변이 있습니다. 예를 들어 호출되는 제품입니다 aprobe 오래 전에 C에서 AOP라고 할 수있는 것을 개척했으며 Java 제품도 있습니다.

확인

예외를 던지는 것은 좋은 출발이지만 올바른 결과를 얻었 음을 확인해야합니다. 당신이 가진 코드 샘플이 올바른 것으로 가정하면, 당신은 당신이 그 예외를 기록했는지 확인하려고합니다. 위의 누군가가 당신의 로거에 모의 개체를 사용하여 언급 한 사람은 실행 가능한 옵션입니다. 여기에서 AOP를 사용하여 로거로 전화를 걸 수 있습니다.

나는 로거가 있다고 가정합니다 log4J; 비슷한 문제를 해결하기 위해 Log4J 출력을 캡처하는 나만의 log4J appender를 구현했습니다. ERROR 그리고 FATAL, 그러한 경우 흥미로운 로그 메시지 일 가능성이 높습니다. Appender는 참조됩니다 log4j.xml 테스트 실행 중에 활성화되어 오류 로그 출력을 캡처합니다. 이것은 본질적으로 모의 개체이지만 log4J를 얻은 모든 코드를 재구성 할 필요는 없었습니다. Logger.

나는 내가 다루려고하는 ioexception 캐치가있는 코드에 대한 테스트를 작성하고 있습니다.

나는 당신의 목표를 이해하지 못한다고 확신하지는 않지만 예외가 발생하는지 테스트하고 싶다면 예외를 던질 것으로 예상 할 수 있습니다.

@Test(expected=IOException.class)

예외가 발생하지 않으면 시험이 실패하고 (예 :) (예 : cacheFileName 파일이 없습니다).

filenotfoundException은 분명히 캐치를 유발할 것입니다. Javadoc은 그것이 던져 질 경우를 진술합니다.

또한 ObjectOutputStream 생성자가 IOException을 던질 수 있으므로 테스트 에서이 케이스를 다룰 수 있다고 생각해야합니다.

두 가지 쉬운 방법은 CachefiLename을 존재하지 않는 파일로 설정하거나 지정된 파일을 읽기 전용 액세스로 설정하는 것입니다.

-남자

코드가 현재 작성되었으므로 Logger 객체에서 오류 () 호출을 조롱하고 IOException을 기대할 때 호출되는지 확인할 수 있습니다.

테스트하려는 욕구는 코드가 작성된대로 코드의 근본적인 문제를 발견했을 수 있습니다. 오류가 발생하지만 파일에 쓰기가 성공했는지 확인하기 위해 다른 코드 섹션을 제공하는 부울 또는 플래그 값 (파일 이름을 특수 패턴으로 설정)이 없습니다. 이것이 함수에 포함 된 경우 부울을 반환하거나 객체 레벨 변수를 설정할 수 있습니다.

cacheFileName = "thisFileShouldNeverExistAndIfItDoesYouAreScrewingUpMyTests";

물론, 당신은 발걸음을 내딛고 후프를 통해 점프하여 프로그래밍 방식으로 파일 이름이 결코 존재하지 않도록 또는 99.99999%의 사례에 결코 존재하지 않는 문자열을 사용할 수 있습니다.

나는 이것이 당신이 의미하는 바이기를 바랍니다.

if(new File(cachedFile).exists()) {
    oos = new ObjectOutputStream(new FileOutputStream(cacheFileName));
    //do your code here
} else {
    throw new FileNotFoundException("File doesn't exist!");
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top