构造函数Mockito中使用的模拟私有方法

问题描述 投票:0回答:1

我正在尝试测试类中的方法,该类具有如下构造函数:

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()))”起作用。有人可以建议如何模拟在构造函数中使用的私有方法吗?因此,在模拟类之前,我需要模拟此方法。

methods constructor private
1个回答
0
投票

我已通过在我的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);
© www.soinside.com 2019 - 2024. All rights reserved.