返回

规避 Arch 单元测试 NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS 失败的替代方法有哪些?

java

规避 Arch 单元测试 NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS 失败规则的替代方法

遵循 Arch 单元测试规则的应用程序中,禁止使用标准 Java I/O 流。违反这一规则会导致 "NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS" 失败。

问题:为什么禁止使用标准流?

标准流(System.in、System.out 和 System.err)耦合了测试类和测试环境。这使得测试变得脆弱,因为它们依赖于外部因素,例如系统控制台的可用性。此外,标准流的输出可能会污染测试报告,使结果难以解释。

解决方案:替代方法

为了避免 "NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS" 失败,有几种替代标准流的方法可用。

1. 日志记录系统

日志记录框架(如 Log4j、SLF4J)提供了一种替代方案,用于向控制台或文件输出消息。它允许开发人员控制输出级别和格式。

Logger logger = Logger.getLogger(MyClass.class);
logger.info("Message");

2. 缓冲区和编写器

使用 java.io.BufferedWriter 或 java.io.PrintWriter 写入到缓冲区中。然后调用 flush() 方法将缓冲区中的内容刷新到输出流。

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
writer.write("Message");
writer.flush();

3. 字符串连接器

将字符串连接起来并使用 StringBuilder.toString() 方法获取结果字符串。然后使用 System.out.println(sb.toString()) 打印结果。

StringBuilder sb = new StringBuilder();
sb.append("Message");
System.out.println(sb.toString());

4. 第三方库

存在第三方库(如 Guava 的 CharStreams)提供流式处理功能,而无需使用标准流。

CharStreams.copy(System.in, System.out);

选择替代方法

选择替代方法取决于具体情况和应用程序的需求。日志记录系统适用于需要丰富输出和控制输出级别的场景。缓冲区和编写器适合需要高效缓冲输出的情况。字符串连接器对于小而简单的输出有用。第三方库为流式处理提供了更高级的功能。

结论

通过使用替代方法,我们可以规避 Arch 单元测试中的 "NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS" 失败规则,同时保持测试的可靠性和可解释性。选择合适的替代方法取决于应用程序的具体需求。

常见问题解答

1. 使用替代方法是否会影响测试性能?

使用替代方法可能会引入少量开销,但通常可以忽略不计。

2. 替代方法与传统 I/O 流相比有哪些优点?

替代方法提供更灵活的输出控制、更好的测试隔离和更可读的测试报告。

3. 是否有其他替代方法可以使用?

是的,其他替代方法包括使用 mocking 框架或自定义输出拦截器。

4. 如何确保我选择合适的替代方法?

考虑应用程序的需求、输出的复杂性和性能要求。

5. 实施替代方法有哪些最佳实践?

使用明确的日志记录级别、在测试中正确关闭流,并遵循代码可读性最佳实践。