Java 单元测试期间的NullPointerException
我正在尝试对覆盖文件的覆盖方法进行单元测试(如果给定文件不存在,则创建新的覆盖方法)。 我的想法是在覆盖前和覆盖后与数组进行比较,所以我做到了,但不幸的是(一如既往)出现了NPE 下面是我要测试的类的方法:Java 单元测试期间的NullPointerException,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我正在尝试对覆盖文件的覆盖方法进行单元测试(如果给定文件不存在,则创建新的覆盖方法)。 我的想法是在覆盖前和覆盖后与数组进行比较,所以我做到了,但不幸的是(一如既往)出现了NPE 下面是我要测试的类的方法: package rankingsystem; import contentfile.ContentFileRetriever; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOExcep
package rankingsystem;
import contentfile.ContentFileRetriever;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
public class RankingSystemService {
private static final int FIRST_PART = 0;
private static final int SECOND_PART = 1;
private ContentFileRetriever contentFileRetriever;
public RankingSystemService(ContentFileRetriever contentFileRetriever) {
this.contentFileRetriever = contentFileRetriever;
}
...
String[] retrieveRankingData(String rankingPathFile) {
return contentFileRetriever.getContentFile(rankingPathFile);
}
void overwriteFileWithGivenResult(String name, long timeOfFinishingGame, String rankingPathFile) {
try (FileWriter writer = new FileWriter(rankingPathFile, true);
BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
bufferedWriter.write(name + " " + timeOfFinishingGame);
bufferedWriter.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以下是ContentFileRetriever
类:
package contentfile;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ContentFileRetrieverService implements ContentFileRetriever {
@Override
public String[] getContentFile(String pathName) {
Stream<String> contentFileStream;
try {
contentFileStream = Files.lines(Paths.get(pathName));
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
return contentFileStream.toArray(String[]::new);
}
}
以下是stacktrace:
java.lang.NullPointerException
at rankingsystem.RankingSystemService.retrieveRankingData(RankingSystemService.java:38)
at rankingsystem.RankingSystemServiceTest.overwriteFileWithGivenResult(RankingSystemServiceTest.java:39)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
我做错了什么?我在评论中的人的帮助下解决了这个问题。 需要补充:
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
rankingSystemService = new RankingSystemService(contentFileRetrieverService);
}
您没有在模拟上定义任何行为。默认行为是返回
null
。除此之外,您还缺少让Mockito解析@Mock
注释的@RunWith(MockitoJUnitRunner.class)
。NPE的位置意味着只有一种解释。contentFileRetriever
字段已初始化(或更新)为null
。在这种情况下,@DaveyDaveDave可能存在重复项,我认为重复项不会有多大帮助。这里没有答案可以帮助你。@pipilam——没关系,这只是一个建议,你没有做错什么——编写测试是件好事。
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
rankingSystemService = new RankingSystemService(contentFileRetrieverService);
}