断言 OutputStreamWriter 包含正确的 OutputStream 实例

Assert OutputStreamWriter contains correct instance of OutputStream

我正在为 returns Writer 不同扩展文件的方法编写测试。

对于.gzreturnsnew OutputStreamWriter(new GZIPOutputStream(new FileOutputStream(file)), StandardCharsets.UTF_8)

对于非压缩文件 returns new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);

如何断言OutputStreamWriter包含GZIPOutputStreamFileOutputStream

OutputStreamWriter 扩展了 Writer。您的 FileOutputStream 或 GZIPOutputStream 设置为:protected Object lock inside Writer class.

 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(new File("file_patch")), StandardCharsets.UTF_8);
    Field lock = outputStreamWriter.getClass().getSuperclass().getDeclaredField("lock");
    lock.setAccessible(true);
    Object o = lock.get(outputStreamWriter);
    Class<?> theClassYouNeed = o.getClass();

现在您只需要检查您需要的类是否符合预期 class。

考虑将您的代码分成两种可测试的方法,一种用于基础 OutputStream,您可以使用 instanceof GZIPOutputStream 进行测试(或不正确,具体取决于文件),另一种方法使用 Writer 测试 - 这验证 UTF-8 输出文件是否符合预期(有或没有 GZIP)。

如果您使用 File 而不是 Path:

,您可以轻松调整此示例
public static OutputStream newOutputStream(final Path file) throws IOException {
    // identify gzipped data files
    boolean isGZ = file.getFileName().toString().toLowerCase().endsWith(".gz");
    OutputStream out = Files.newOutputStream(file);
    return isGZ ? new GZIPOutputStream(out, 8192) : out;
}
public static OutputStreamWriter newWriter(final Path file) throws IOException {
    return new OutputStreamWriter(newOutputStream(file), StandardCharsets.UTF_8);
}

这也意味着您可以将 GZIP 写作 newOutputStream(Path) 重新用于其他文件类型,而不仅仅是基于 UTF-8 的文本文件。