Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为输出到控制台的void函数编写junit测试用例_Java_Unit Testing_Testing_Junit_Automated Tests - Fatal编程技术网

Java 如何为输出到控制台的void函数编写junit测试用例

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

我有两个函数addKeywords和search,它们具有void返回类型,search函数将结果打印到控制台。 这是密码

 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)
我不确定这是否是为具有void返回类型的函数编写junit测试用例并将输出输出到控制台的正确方法。
有人能告诉我正确的代码吗?

您需要以
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解决测试问题,我认为传递一个可变,writable
Stream
是一个比通过使方法返回结果并将打印责任转移给调用方(根据romfet的评论)使方法更具功能更糟糕的解决方案@kryger是的,我同意。“romfret”加上“r”;)。我们都同意。显然,“@romfret加上一个r”(甚至两个r:))。可悲的是,自动完成不适用于在同一问题下没有评论的人。@kryger哦,是的,我明白了。。。没问题!:)
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(byteArrayOutputStream);

ps.println("...");

assertEquals("expectedOutput", byteArrayOutputStream.toString())