You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JUnit测试报错:Actual array is null——文件覆写方法单元测试问题

问题分析与解决方案

你遇到的actual array was null错误,核心原因是你用Mockito创建了ContentFileRetriever的Mock对象,但没有为它的getContent方法设置任何返回值。Mockito的Mock对象默认会对所有方法返回null(引用类型),所以当你调用retrieveRankingData时,实际拿到的就是null,自然会触发断言失败。

另外还有个小细节:你的overwriteFileWithGivenResult方法里,FileWriter的第二个参数传了true,这是追加写入的逻辑,和方法名里的"overwrite"(覆写)不符,如果确实需要覆写文件,得把这个参数去掉或者改成false。

下面提供两种可行的解决思路:


方案一:为Mock对象打桩,模拟返回值

这种方法适合隔离依赖,只测试overwriteFileWithGivenResult本身的逻辑:

@Test
public void overwriteFileWithGivenResult() throws IOException {
    File rankingFile = tempFolder.newFile("rankingText.txt");
    String rankingFilePath = rankingFile.getPath();

    // 1. 初始状态:文件为空,让Mock返回空数组
    when(contentFileRetriever.getContent(rankingFilePath)).thenReturn(new String[]{});
    String[] actualResultBeforeOverwriting = rankingSystemService.retrieveRankingData(rankingFilePath);
    String[] expectedResultBeforeOverwriting = {};
    assertArrayEquals(expectedResultBeforeOverwriting, actualResultBeforeOverwriting);

    // 执行覆写操作(注意这里如果要真·覆写,记得修改FileWriter的参数)
    rankingSystemService.overwriteFileWithGivenResult("Piotr", 1L, rankingFilePath);

    // 2. 写入后:让Mock返回预期的内容数组
    when(contentFileRetriever.getContent(rankingFilePath)).thenReturn(new String[]{"Piotr 1"});
    String[] afterOverwriting = rankingSystemService.retrieveRankingData(rankingFilePath);
    String[] expectedResultAfterOverwriting = {"Piotr 1"};
    assertArrayEquals(expectedResultAfterOverwriting, afterOverwriting);
}

方案二:使用真实的ContentFileRetriever实例

这种方法更贴近真实场景,验证"写入文件+读取文件"的完整流程:

public class RankingSystemServiceTest {
    @Rule
    public TemporaryFolder tempFolder = new TemporaryFolder();

    // 替换Mock为真实的实现类(假设你的实现类叫ContentFileRetrieverImpl)
    private ContentFileRetriever contentFileRetriever = new ContentFileRetrieverImpl();
    private RankingSystemService rankingSystemService;

    @Before
    public void setup() {
        rankingSystemService = new RankingSystemService(contentFileRetriever);
    }

    @Test
    public void overwriteFileWithGivenResult() throws IOException {
        File rankingFile = tempFolder.newFile("rankingText.txt");
        String rankingFilePath = rankingFile.getPath();

        // 初始读取空文件,返回空数组
        String[] actualResultBeforeOverwriting = rankingSystemService.retrieveRankingData(rankingFilePath);
        String[] expectedResultBeforeOverwriting = {};
        assertArrayEquals(expectedResultBeforeOverwriting, actualResultBeforeOverwriting);

        // 执行覆写操作(记得修正FileWriter的追加参数)
        rankingSystemService.overwriteFileWithGivenResult("Piotr", 1L, rankingFilePath);

        // 真实读取写入后的文件内容
        String[] afterOverwriting = rankingSystemService.retrieveRankingData(rankingFilePath);
        String[] expectedResultAfterOverwriting = {"Piotr 1"};
        assertArrayEquals(expectedResultAfterOverwriting, afterOverwriting);
    }
}

额外修正:确保"覆写"逻辑正确

如果你确实需要实现覆写(而不是追加),修改overwriteFileWithGivenResult的FileWriter初始化代码:

try (FileWriter writer = new FileWriter(rankingPathFile); // 去掉true参数,默认覆盖原有内容
     BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
    bufferedWriter.write(name + " " + timeOfFinishingGame);
    bufferedWriter.newLine();
} catch (IOException e) {
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者pipilam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:26:20