JUnit 4 e arquivos

Testar código que manipula arquivos com o JUnit em geral é muito chato. Os testes ficam cheios de código que usa a API de io do Java e que deixa de expressar o comportamento do código.

A classe TemporaryFolder do JUnit 4.7 tem uma API para criar arquivos e diretórios dentro de um diretório temporário. Essa classe usa o mecanismo de @Rule do JUnit 4 apagar arquivos depois de cada teste (depois até do @After do teste atual).

public class FileUploaderTest {
	
    @Rule
    public TemporaryFolder folder = new TemporaryFolder();

	private static final String INPUT_FILENAME = "input.ext";
	private static final String OUTPUT_FILENAME = "output.ext";
	
	private FileUploader fileUploader;
	private File inputFile;
	private File outputDir;

	@Before
	public void setUp(){
		outputDir = folder.newFolder("outputDir");
		fileUploader = new FileUploader(outputDir);
		inputFile = new File(INPUT_FILENAME);
	}

	@Test
	public void shouldWriteTheUploadedFile() throws IOException{
		inputFile = folder.newFile(INPUT_FILENAME);

		fileUploader.upload(inputFile, OUTPUT_FILENAME);
		
		File outputFile = new File(outputDir, OUTPUT_FILENAME);
		assertTrue(outputFile.exists());
	}

	@Test(expected=FileUploadException.class)
	public void inputFileShouldNotBeADirectory(){
		inputFile = folder.newFolder(INPUT_FILENAME);
		fileUploader.upload(inputFile, OUTPUT_FILENAME);
	}
}