Saya memiliki kelas sederhana yang menulis data ke file CSV:

public class CsvFileWriter {
    private static Logger logger = LogManager.getLogger();

    public static void writeDataToCsvFile(String filePath, List<String[]> data) {
        File file = new File(filePath);
        try (FileWriter outputFile = new FileWriter(file)) {
            CSVWriter writer = new CSVWriter(outputFile, ' ',
                    CSVWriter.NO_QUOTE_CHARACTER,
                    CSVWriter.DEFAULT_ESCAPE_CHARACTER,
                    CSVWriter.DEFAULT_LINE_END);
            writer.writeAll(data);
        } catch (IOException e) {
            logger.error("Unable to find the specified path", e);
            throw new ProjectException(e);
        }
    }
}

Saya ingin tahu cara menguji metode yang ada di kelas ini. Saya menemukan informasi bahwa ini dapat dilakukan dengan menggunakan Mockito. Apakah begitu? dan bagaimana saya bisa melakukan ini?

0
misnomer42 3 Juli 2020, 13:47

1 menjawab

Jawaban Terbaik

Anda tidak perlu Mockito atau ejekan apa pun untuk mengujinya (dengan pengecualian penanganan dan pencatatan kegagalan). Anda harus menggunakan @TempDir dari Junit 5, atau TemporaryFolder dari Junit 4

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;

class CsvFileWriterTest {
    @Test
    void createsCsvFile(@TempDir final Path temp) {
        final var csv = temp.resolve("test.csv");
        CsvFileWriter.writeDataToCsvFile(
                csv.toString(),
                List.of(
                        new String[]{"1", "abc"},
                        new String[]{"2", "def"}
                )
        );
        Assertions.assertTrue(csv.toFile().exists());
    }

    @Test
    void writesDataToCsv(@TempDir final Path temp) throws IOException {
        final var csv = temp.resolve("test.csv");
        CsvFileWriter.writeDataToCsvFile(
                csv.toString(),
                List.of(
                        new String[]{"1", "abc"},
                        new String[]{"2", "def"}
                )
        );
        Assertions.assertEquals(
                Files.readAllLines(csv),
                List.of("1 abc", "2 def")
        );
    }
}

Meskipun Anda mungkin ingin memperbaiki kelas Anda agar lebih dapat diuji:

@lombok.RequiredArgsConstructor
public class CsvFileWriter {
    private static final Logger LOG = LogManager.getLogger();
    private final Path file;
    private final Function<Writer, CSVWriter> csvfactory;

    public CsvFileWriter(final Path file) {
        this(
            file,
            writer ->
                new CSVWriter(writer, ' ',
                    CSVWriter.NO_QUOTE_CHARACTER,
                    CSVWriter.DEFAULT_ESCAPE_CHARACTER,
                    CSVWriter.DEFAULT_LINE_END
                )
        );
    }

    public void write(final List<String[]> data) {
        try (var csv = this.csvfactory.apply(Files.newBufferedWriter(this.file))) {
            csv.writeAll(data);
        } catch (IOException ex) {
            LOG.error("Unable to find the specified path", ex);
            throw new UncheckedIOException(ex);
        }
    }
}

Sekarang Anda dapat meneruskan metode pabrik ke konstruktor, dan menggunakannya untuk mengejek CSVWriter. Misalnya Anda dapat menguji bahwa IOException ditangani dengan benar oleh kelas Anda:

@Test
void handlesIoException(@TempDir final Path temp) {
    final var mock = Mockito.mock(CSVWriter.class);
    Mockito.doThrow(IOException.class).when(mock).writeAll(Mockito.anyList());
    final var writer = new CsvFileWriter(temp.resolve("not.csv"), wrt -> mock);
    Assertions.assertThrows(
        UncheckedIOException.class,
        () -> writer.write(List.of())
    );
}
2
andreoss 3 Juli 2020, 11:34