规避 Arch 单元测试 NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS 失败的替代方法有哪些?
2024-03-02 21:07:10
规避 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. 实施替代方法有哪些最佳实践?
使用明确的日志记录级别、在测试中正确关闭流,并遵循代码可读性最佳实践。