要使此工作正常进行,您需要使用powermockito来拦截构造函数调用(新的InputStreamReader(…),新的BufferedReader(…)),以便返回模拟。下面是一个示例。在您的情况下,仅拦截新的BufferedReader调用就足够了。
假设以下是您要测试的代码:
package test;
import java.io.*;
public class SUT {
public String doSomething() throws IOException {
InputStreamReader reader =
new InputStreamReader(getFileAsStream(null, null));
BufferedReader bReader =
new BufferedReader(reader);
return bReader.readLine();
}
private InputStream getFileAsStream(Object resourceResolver, Object iconPath)
throws FileNotFoundException {
return new ByteArrayInputStream("".getBytes());
}
}
package test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.powermockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import static org.junit.Assert.assertEquals;
import static org.powermock.api.mockito.powermockito.doReturn;
import static org.powermock.api.mockito.powermockito.mock;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ SUT.class })
public class SUTTest {
@Test
public void doSomethingReturnsValueFromBufferedReader() throws Exception {
// Arrange
SUT sut = new SUT();
InputStreamReader inputStreamReaderMock = mock(InputStreamReader.class);
BufferedReader bufferedReaderMock = mock(BufferedReader.class);
// Set your mocks up to be returned when the new ...Reader calls
// are executed in sut.doSomething()
powermockito.whenNew(InputStreamReader.class).
withAnyArguments().thenReturn(inputStreamReaderMock);
powermockito.whenNew(BufferedReader.class).
withArguments(inputStreamReaderMock).
thenReturn(bufferedReaderMock);
// Set the value you want bReader.readLine() to return
// when sut.doSomething() executes
final String bufferedReaderReturnValue = "myValue";
doReturn(bufferedReaderReturnValue).when(bufferedReaderMock).readLine();
// Act
String result = sut.doSomething();
// Assert
assertEquals(bufferedReaderReturnValue, result);
}
}
希望这可以帮助您解决当前的问题。但是,在我看来,您正在创建的内容将是一个非常缓慢,令人困惑且脆弱的测试。现在,您正在嘲笑太多,以致于很难确定您实际要测试的内容。
大量的模拟可能表明您正在测试的代码设计将需要做一些工作以提高可测试性。如果您无法触摸代码,那么您将无法这样做- 但是请尝试使您的测试更具可读性和直观性(“调用此方法时,应该发生此事,因为…”)。