看起来你在嘲笑错误的事情。你想和
ConsoleReader
的返回。所以有两种选择:
移动以使用一些
getConsoleReader()
方法
IOHelper
类,然后您可以模拟它-您需要确保
IOHelper
private final IOHelper mySpy = spy(IOHelper.getInstance());
@Before
public void setup() {
final ConsoleReader mockCR = mock(ConsoleReader.class);
// Any mockery on your mockCR you need.
// doReturn(...).when(mockCR).readLine();, etc.
doReturn(mockCR).when(mySpy).getConsoleReader();
}
将cr字段修改为模拟。例如。
private final IOHelper ioHelper= IOHelper.getInstance();
@Before
public void setup() {
final ConsoleReader mockCR = mock(ConsoleReader.class);
// Any mockery on your mockCR you need.
// doReturn(...).when(mockCR).readLine();, etc.
ioHelper.cr = mockCR;
}
控制台阅读器
是
public
final
),这就是一个要求。即使字段是私有的,也可以使用一些助手库来处理它。spring和apache-commons-lang3都提供了这种类型的实用程序。
使用Powermock修改
控制台阅读器
@RunWith(PowerMockRunner.class)
@PrepareForTest(IOHelper.class)
public class IOHelperTest {
@BeforeClass
public static void setup() {
final ConsoleReader mockCR = mock(ConsoleReader.class);
// Any mockery on your mockCR you need.
// doReturn(...).when(mockCR).readLine();, etc.
PowerMock.whenNew(ConsoleReader.class).thenReturn(mockCR);
}
}
最后,您可以修改
IOHelper
上课
控制台阅读器
作为构造函数参数,只需提供
mockCR
从上述所有方法中(并使其不
private
).