2011-03-31 186 views
1

这已被问过,但没有澄清到我得到它的地步。与我在这个主题上看到的其他一两个线程类似,我正在使用命令行输入来登录/关闭,断开连接等工作,并且我不确定如何在JUnit测试中对其进行模拟案件。其他回复表明我应该尝试将System.in更改为单独的InputStream,但是......然后呢? dr:我在我的实际代码中有一个用于解析命令行输入的方法,并且需要JUnit测试方法,输入并正确处理这些方法。JUnit命令行测试

回答

1

编辑:看来我误解了这个问题。我通常使用术语“命令行输入”来指代给予流程开始的命令行参数,而不是交互式控制台输入。然而...

汉鼎你真正的代码,通过使用不同的InputStream甚至可能是一个ReaderScanner的确会帮助 - 任何以“让输入”部分从控制台中分离出来。然后,您可以非常容易地将输入伪装成一行,在测试代码中使用字符串作为输入,然后将其转换为字节并将这些字节包装到ByteArrayInputStream中或直接将字符串包装到StringReader中。

这样做的不足之处在于,为了检查结果,在一个命令后面做这个“暂停”并没有简单的方法。

您可能要有所改变设计,使得其读取部分输入来自哪个处理输入部分分离。阅读部分可能是一个非常简单的循环,顺序上:

String line; 
while ((line = reader.readLine()) != null) { 
    handleInput(line); 
} 

然后,您可能会离开的那部分未经测试的单元测试,或者写一些比较原始的测试 - 但你可以再测试handleInput广泛,如它现在与输入源分离。


原来的答复

如果你提取从真正启动应用程序的代码解析的代码,很容易:运行该代码,并检查结果。当然,如果你有某种封装选项的类,这将是最简单的。例如,您main方法可能是这样的:

public static void main(String[] args) { 
    Options options = Options.parse(args); 
    // Use options here 
} 

然后,你可以测试Options.parse变得非常容易。

+0

我可能只是有一个史诗般的brainfart,但我不认为这真的回答了我的问题。我可以在我的JUnit测试用例中启动“Welcome,请输入命令:”循环,但是如何从前面提到的没有主要方法的测试用例输入命令? – 2011-03-31 06:05:47

+0

@尼克:啊,我明白了。通过“命令行输入”,我认为你的意思是命令行参数......而你的意思是交互式控制台输入。将编辑。 – 2011-03-31 06:11:03

+0

我认为把阅读与处理分开是我的方法。有一个接受字符串参数的方法,所以我可以在JUnit中手动传递它,这将使我的生活变得轻松。谢谢。 – 2011-03-31 06:22:45

相关问题