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
相关产品推荐
相关产品推荐

