gpt4 book ai didi

java - 如何在 JUnit 中测试 IO 代码?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:15 26 4
gpt4 key购买 nike

我想测试两个服务:

  1. 构建文件名的服务
  2. 将一些数据写入第一个服务提供的文件的服务

首先,我正在构建一些复杂的文件结构(例如 {user}/{date}/{time}/{generatedId}.bin)

第二步,我将数据写入第一个服务传递的文件(第一个服务调用第二个服务)

如何在不进行任何真正的 IO 交互的情况下使用模拟来测试这两个服务?

举个例子:

第一次服务:

public class DefaultLogService implements LogService
{

public void log(SomeComplexData data)
{
serializer.write(new FileOutputStream(buildComplexFileStructure()), data);
or
serializer.write(buildComplexFileStructure(), data);
or
serializer.write(new GenericInputEntity(buildComplexFileStructure()), data);
}

private ComplextDataSerializer serializer; // mocked in tests
}

第二次服务:

public class DefaultComplexDataSerializer implements ComplexDataSerializer
{

void write(InputStream stream, SomeComplexData data) {...}
or
void write(File file, SomeCompexData data) {...}
or
void write(GenericInputEntity entity, SomeComplexData data) {...}

}

在第一种情况下,我需要传递将创建文件的 FileOutputStream(即我无法测试第一个服务)

在第二种情况下,我需要传递文件。如果我需要测试将写入指定文件的数据,我可以在第二次服务测试中做什么? (我无法测试第二个服务)

在第三种情况下,我想我需要一些通用的 IO 对象来包装文件。也许有一些现成的解决方案可用于此目的?

最佳答案

在第一种情况下,如果您要测试文件名生成,为什么还要关心文件本身?您不想测试 FileOutputStream。

我假设你的方法看起来像这样:

public File buildComplexFileStructure() {
// code
}

你的测试看起来像这样:

@Test public void test() throws Exception {
File expected = <what you expect to be generated>;
File actual = new DefaultLogService().buildComplexFileStructure();
assertEquals(expected, actual);
}

如果该方法未公开,则只需将其公开给测试(默认或 protected )。

在第二种情况下,您不能将测试测试中的 ByteArrayOutputStream 传递到您的方法中,然后验证写入的内容吗?即:

@Test public void test() throws Exception {
btye[] expected = <expected data>;
ByteArrayOutputStream actualStream = new ByteArrayOutputStream();
new DefaultComplexDataSerializer().write(actualStream, data);
byte[] actualData = actualStream.toByteArray();
// compare expected and actualData
}

关于java - 如何在 JUnit 中测试 IO 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com