Java 如何为输出到控制台的void函数编写junit测试用例
我有两个函数addKeywords和search,它们具有void返回类型,search函数将结果打印到控制台。 这是密码Java 如何为输出到控制台的void函数编写junit测试用例,java,unit-testing,testing,junit,automated-tests,Java,Unit Testing,Testing,Junit,Automated Tests,我有两个函数addKeywords和search,它们具有void返回类型,search函数将结果打印到控制台。 这是密码 void addKeywords(String video)throws IOException{ InputStreamReader ip = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(ip); Integer previousVal=0
void addKeywords(String video)throws IOException{
InputStreamReader ip = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(ip);
Integer previousVal=0;
if(!videoKeyword.containsKey(video) && videoNames.contains(video)){
videoKeyword.put(video,new HashSet<String>());
}
else if(!videoNames.contains(video)){
System.out.println("Video is not a part of lookup");
}
System.out.println("Enter keywords for video");
String keyword =br.readLine();
if(!keywordLength.containsKey(video))
keywordLength.put(video, 0);
if((keywordLength.get(video)+keyword.length())<500){
videoKeyword.get(video).add(keyword);
previousVal=keywordLength.get(video);
keywordLength.put(video, previousVal+keyword.length());
}
else{
System.out.println("Maximum length exceeded for video "+ video);
}
if(!kewordVideo.containsKey(keyword)){
kewordVideo.put(keyword,new HashSet<String>());
}
kewordVideo.get(keyword).add(video);
}
void search(String searchKey){
for (Entry<String, HashSet<String>> entry : videoKeyword.entrySet()) {
for (String s : entry.getValue()) {
if (s.startsWith(searchKey)) {
System.out.println(searchKey+" is mapped to "+entry.getKey());
break;
}
}
}
}
我得到以下错误
类型Assert中的方法assertEquals(Object,Object)不适用于参数
(字符串,无效)
- 令牌“video1”上的语法错误,请删除 这个令牌
- 令牌上的语法错误,放置错误 建造(s)
有人能告诉我正确的代码吗?您需要以
PrintStream
的形式将System.out
传递给类的构造函数,然后再写入。因此,您可以在单元测试中将其替换为自定义流,转换为字符串
,并验证它:
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(byteArrayOutputStream);
ps.println("...");
assertEquals("expectedOutput", byteArrayOutputStream.toString())
(还应将System.in
作为参数传递,以进一步解耦)
更新
正如@kryger指出的:您应该将结果作为
字符串返回,并将打印责任转移给调用者。您可以使用System.setOut(printStream)和System.setErr(printStream)
函数重定向System.out或System.err消息。
这样,您就可以将System.out消息放入printstream对象并读取它。为什么不让搜索(…)
method return a String?允许search method return的问题是可能有多个输出,因此,一旦我返回剩余值,将不会打印,因此我不使用return。您还可以返回列表
或字符串[]
然后编写一个函数来打印它。很好,我这样做了,但我仍然有语法错误,我无法解决您的语法错误是什么?如果我们建议更改代码以帮助OP解决测试问题,我认为传递一个可变,writableStream
是一个比通过使方法返回结果并将打印责任转移给调用方(根据romfet的评论)使方法更具功能更糟糕的解决方案@kryger是的,我同意。“romfret”加上“r”;)。我们都同意。显然,“@romfret加上一个r”(甚至两个r:))。可悲的是,自动完成不适用于在同一问题下没有评论的人。@kryger哦,是的,我明白了。。。没问题!:)
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(byteArrayOutputStream);
ps.println("...");
assertEquals("expectedOutput", byteArrayOutputStream.toString())