NullPointerException во время модульного тестирования - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь протестировать мой метод перезаписи, который перезаписывает файл (или создать новый, если данный файл не существует). Моя идея состояла в том, чтобы сравнить с массивами перед перезаписью и после перезаписи, поэтому я сделал это, но, к сожалению (как всегда), произошел 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)

Что я делаю не так?

1 Ответ

2 голосов
/ 18 апреля 2019

Я решил это с помощью парней в комментариях. Необходимо добавить:

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    rankingSystemService = new RankingSystemService(contentFileRetrieverService);
}
...