我正在尝试测试类中的方法,该类具有如下构造函数:
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()))”起作用。有人可以建议如何模拟在构造函数中使用的私有方法吗?因此,在模拟类之前,我需要模拟此方法。
我已通过在我的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);