Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单元测试期间的NullPointerException_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 单元测试期间的NullPointerException

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

我正在尝试对覆盖文件的覆盖方法进行单元测试(如果给定文件不存在,则创建新的覆盖方法)。 我的想法是在覆盖前和覆盖后与数组进行比较,所以我做到了,但不幸的是(一如既往)出现了NPE

下面是我要测试的类的方法:

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);
}