我有一个方法,可以从标准输入读取行并将行写入标准输出。
在JUnit测试中,我如何向该方法发送输入,并如何捕获其输出,以便我可以对其进行断言?
我有一个方法,可以从标准输入读取行并将行写入标准输出。
在JUnit测试中,我如何向该方法发送输入,并如何捕获其输出,以便我可以对其进行断言?
您不应该有一个从标准输入读取并写入标准输出的方法。
您应该有一个方法,它接受作为参数要读取的InputStream
和要写入的PrintStream
。(这是一种称为依赖注入(Wikipedia)的原则在方法级别上的应用,通常在类级别上使用。)
然后,在正常情况下,您会传递System.in
和System.out
作为参数来调用该方法。
但是当您想要测试它时,可以将其传递给您为测试目的创建的InputStream
和PrintStream
。
因此,您可以使用以下内容:
void testMyAwesomeMethod( String testInput, String expectedOutput )
{
byte[] bytes = testInput.getBytes( StandardCharsets.UTF_8 );
InputStream inputStream = new ByteArrayInputStream( bytes );
StringWriter stringWriter = new StringWriter();
try( PrintWriter printWriter = new PrintWriter( stringWriter ) )
{
myAwesomeMethod( inputStream, printWriter );
}
String result = stringWriter.toString();
assert result.equals( expectedOutput );
}