如何在JUnit 5中测试以数组为入参的无返回值(void)方法
如何测试无返回值的print方法(输出到System.out)
你的测试代码报错是因为print是void方法,没有返回值,assertArrayEquals要求两边都是数组类型,你拿void去和数组比较,编译器自然会报错。
要测试这个方法,核心是捕获它输出到System.out的内容,然后断言输出是否符合预期。具体步骤如下:
- 先保存原本的
System.out输出流,测试结束后要恢复,避免影响其他测试用例 - 创建一个
ByteArrayOutputStream来临时捕获输出内容 - 将
System.out重定向到这个临时流 - 调用待测试的
print方法 - 把捕获到的输出转换成字符串,和预期的输出字符串做断言
- 恢复原本的
System.out流
下面是完整的测试代码示例(以JUnit 5为例):
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import static org.junit.jupiter.api.Assertions.assertEquals; class ArrayTest { private final PrintStream originalOut = System.out; private ByteArrayOutputStream outputStream; @BeforeEach void setUp() { // 初始化输出捕获流 outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); } @Test void testPrintWithNonEmptyArray() { var arr = new Array(); arr.print(new int[]{1, 2, 3}); // 注意:输出包含换行符,因为最后用的是System.out.println("}") assertEquals("{1, 2, 3}\n", outputStream.toString()); } @Test void testPrintWithEmptyArray() { var arr = new Array(); arr.print(new int[]{}); assertEquals("{}\n", outputStream.toString()); } @AfterEach void tearDown() { // 恢复原本的System.out System.setOut(originalOut); } }
说明:
@BeforeEach注解的方法会在每个测试用例执行前运行,负责设置输出重定向@AfterEach注解的方法会在每个测试用例执行后运行,负责恢复原来的输出流- 测试空数组的情况也很有必要,避免遗漏边界场景
- 断言时要注意输出字符串的细节,比如最后的换行符(因为用了
println),还有逗号和空格的格式
内容的提问来源于stack exchange,提问作者raj7vasani
相关产品推荐
相关产品推荐

