Back to Repositories

Testing File I/O Operations with Progress Tracking in AndroidUtilCode

A comprehensive JUnit test suite for FileIOUtils in AndroidUtilCode that validates file I/O operations. This test class examines reading and writing capabilities with various data formats including input streams, byte arrays, and strings, while incorporating progress monitoring functionality.

Test Coverage Overview

The test suite provides thorough coverage of file I/O operations with multiple data formats.

Key functionality tested includes:
  • Writing files from InputStream with progress tracking
  • Writing files from byte arrays using stream operations
  • String-based file writing and reading operations
  • File content reading to List, String, and byte array formats
  • Progress monitoring during file operations

Implementation Analysis

The testing approach utilizes JUnit 4 framework with systematic validation of both write and read operations. Each test method focuses on a specific file I/O scenario, implementing progress listeners for stream operations and using StringBuilder for generating test data.

The implementation employs standard Java I/O patterns with UTF-8 encoding and demonstrates proper resource cleanup through @After annotations.

Technical Details

Testing tools and configuration:
  • JUnit 4 testing framework
  • StandardCharsets for UTF-8 encoding
  • Custom OnProgressUpdateListener interface
  • Temporary file path configuration via TestConfig.PATH_TEMP
  • BaseTest extension for common test functionality

Best Practices Demonstrated

The test suite exemplifies several testing best practices including proper test isolation, resource cleanup, and comprehensive API coverage.

Notable practices include:
  • Systematic teardown of test files after execution
  • Progress monitoring implementation for long-running operations
  • Varied data size testing from small to large content
  • Consistent error handling and resource management

blankj/androidutilcode

lib/utilcode/src/test/java/com/blankj/utilcode/util/FileIOUtilsTest.java

            
package com.blankj.utilcode.util;

import org.junit.After;
import org.junit.Test;

import java.io.InputStream;
import java.nio.charset.StandardCharsets;

import static com.blankj.utilcode.util.TestConfig.PATH_TEMP;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2017/05/24
 *     desc  : test FileIOUtils
 * </pre>
 */
public class FileIOUtilsTest extends BaseTest {

    @Test
    public void writeFileFromIS() throws Exception {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            sb.append(String.format("%5dFileIOUtilsTest\n", i));
        }
        InputStream is = ConvertUtils.string2InputStream(sb.toString(), "UTF-8");

        FileIOUtils.writeFileFromIS(PATH_TEMP + "writeFileFromIS.txt", is, new FileIOUtils.OnProgressUpdateListener() {
            @Override
            public void onProgressUpdate(double progress) {
                System.out.println(String.format("%.2f", progress));
            }
        });
    }

    @Test
    public void writeFileFromBytesByStream() throws Exception {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 100000; i++) {
            sb.append(String.format("%5dFileIOUtilsTest\n", i));
        }
        byte[] bytes = sb.toString().getBytes(StandardCharsets.UTF_8);

        FileIOUtils.writeFileFromBytesByStream(PATH_TEMP + "writeFileFromBytesByStream.txt", bytes, new FileIOUtils.OnProgressUpdateListener() {
            @Override
            public void onProgressUpdate(double progress) {
                System.out.println(String.format("%.2f", progress));
            }
        });
    }

    @Test
    public void writeFileFromString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; i++) {
            sb.append(i).append("FileIOUtilsTest\n");
        }
        FileIOUtils.writeFileFromString(PATH_TEMP + "writeFileFromString.txt", sb.toString());
    }

    @Test
    public void readFile2List() {
        writeFileFromString();
        for (String s : FileIOUtils.readFile2List(PATH_TEMP + "writeFileFromString.txt")) {
            System.out.println(s);
        }
    }

    @Test
    public void readFile2String() {
        writeFileFromString();
        System.out.println(FileIOUtils.readFile2String(PATH_TEMP + "writeFileFromString.txt"));
    }

    @Test
    public void readFile2Bytes() throws Exception {
        writeFileFromBytesByStream();
        FileIOUtils.readFile2BytesByStream(PATH_TEMP + "writeFileFromIS.txt", new FileIOUtils.OnProgressUpdateListener() {
            @Override
            public void onProgressUpdate(double progress) {
                System.out.println(String.format("%.2f", progress));
            }
        });
    }

    @After
    public void tearDown() {
        FileUtils.deleteAllInDir(PATH_TEMP);
    }

}