簡體   English   中英

單元測試期間發生NullPointerException

[英]NullPointerException during unit test

我試圖對覆蓋文件的覆蓋方法進行單元測試(如果給定的文件不存在,則創建一個新的覆蓋方法)。 我的想法是在覆蓋之前和覆蓋之后與數組進行比較,因此我做到了,但是不幸的是(一如既往)發生了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);
    }
}

這是測試:

package rankingsystem;

import contentfile.ContentFileRetriever;
import contentfile.ContentFileRetrieverService;
import org.junit.Test;
import org.mockito.Mock;

import java.util.LinkedHashMap;
import java.util.Map;

import static org.junit.Assert.*;

public class RankingSystemServiceTest {

    @Mock
    ContentFileRetrieverService contentFileRetrieverService;

    private RankingSystemService rankingSystemService = new RankingSystemService(contentFileRetrieverService);

   ...

    @Test
    public void overwriteFileWithGivenResult() {
        String pathFile = "src\\test\\java\\resources\\RankingFile.txt";

        String[] beforeOverwriting = rankingSystemService.retrieveRankingData(pathFile);
        String[] expectedResultBeforeOverwriting = {};

        assertArrayEquals(expectedResultBeforeOverwriting, beforeOverwriting);

        rankingSystemService.overwriteFileWithGivenResult("Piotr", 1L, pathFile);

        String[] afterOverwriting = rankingSystemService.retrieveRankingData(pathFile);
        String[] expectedResultAfterOverwriting = {"Piotr 1"};

        assertArrayEquals(expectedResultAfterOverwriting, afterOverwriting);
    }
}

這是堆棧跟蹤:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM