Имитация частного метода, используемого в конструкторе Mockito - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь протестировать метод в классе, который имеет конструктор следующим образом:

public class ResponseReader {

public ResponseReader(Socket client){
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            fileWriter = new BufferedWriter(new FileWriter(createFile()));
        } catch (IOException e) {
            throw new RuntimeException("Could not initiate ResponseReader");
        }
    }

Метод createFile в конструкторе является частным:

private static File createFile() {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMddhhmmss");
        String dateAsString = simpleDateFormat.format(new Date());
        File uartDataFile = new File("/root/Logs/" + dateAsString + "data.log");
        LOG.debug("Created data file {}", dataFile);
        return dataFile;
    }

Когда Я пытаюсь протестировать метод из этого класса. Мне нужно создать новый объект и, следовательно, нужно имитировать экземпляры конструктора, прежде чем я создам макет класса:

  private Socket client;
    private InputStreamReader inputStreamReaderMock;
    private InputStream inputStreamMock;
    private BufferedReader bufferedReaderMock;
    private ResponseReader responseReaderMock;

@BeforeEach
public void init() throws Exception {
        inputStreamReaderMock = mock(InputStreamReader.class);
        bufferedReaderMock = mock(BufferedReader.class);
        inputStreamMock = mock(InputStream.class);
        client = mock(Socket.class);
        when(client.getInputStream()).thenReturn(inputStreamMock);

        responseReaderMock = Mockito.spy(new ResponseReader(client));
        PowerMockito.whenNew(BufferedReader.class).
                withArguments(inputStreamReaderMock).
                thenReturn(bufferedReaderMock);
}

Он работает до «new FileWriter (createFile ()) ) ". Может ли кто-нибудь посоветовать, как издеваться над частным методом, который используется в конструкторе? Поэтому мне нужно издеваться над этим методом, прежде чем я буду издеваться над классом.

1 Ответ

0 голосов
/ 08 мая 2020

Я решил эту проблему, добавив сеттеры и пустой конструктор в свой класс ResponseReader:

  public ResponseReader(){}

    //this is used only for testing purpose
    public void setBufferedReader(BufferedReader bufferedReader) {
        this.bufferedReader = bufferedReader;
    }

    //this is used only for testing purpose
    public void setBufferedWriter(BufferedWriter bufferedWriter) {
        this.bufferedWriter = bufferedWriter;
    }

, а затем в тесты:

PowerMockito.whenNew(BufferedWriter.class).withArguments(fileWriterMock).thenReturn(bufferedWriterMock);
        PowerMockito.whenNew(BufferedReader.class).
                withArguments(inputStreamReaderMock).
                thenReturn(bufferedReaderMock);
        responseReaderMock.setBufferedReader(bufferedReaderMock);
        responseReaderMock.setBufferedWriter(bufferedWriterMock);
...