如何为void函数编写junit测试用例,将输出打印到控制台

时间:2015-05-27 07:31:00

标签: java unit-testing testing junit automated-tests

我有两个函数addKeywords和search具有void返回类型,搜索功能将结果打印到控制台。 这是代码

 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;
            }
        }
     }
 }

我写过junit考试

 public class MyUnitTest extends CultureMachineAssignment {
      CultureMachineAssignment testObj =new CultureMachineAssignment();
      testObj.insertDataIntoSet();
      testObj.addkeywords("video1");

     @Test
     public void testVideo() {
        assertEquals("video1", testObj.search("abcd"));
    }
}

我收到以下错误

Assert类型中的assertEquals(Object,Object)方法不适用于参数      (String,void)

  • 令牌“”video1“”上的语法错误,删除  这个标记
  • 令牌上的语法错误,放错位置  构造

我不确定这是否是为具有void返回类型的函数编写junit测试用例并将输出打印到控制台的正确方法。 有人可以告诉我正确的代码吗?

2 个答案:

答案 0 :(得分:2)

您可以使用System.setOut(printStream) and System.setErr(printStream)函数重定向System.out或System.err消息。
通过这种方式,您可以将System.out消息放入打印流对象中并进行读取。

答案 1 :(得分:1)

您需要以System.out的形式将PrintStream传递给类的构造函数,然后再写入它。因此,您可以在单元测试中将自定义流替换为String并验证它:

final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(byteArrayOutputStream);

ps.println("...");

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

(您还应该将System.in作为参数传递给进一步解耦)

更新

正如@kryger指出的那样:您应该将结果作为String返回,并将打印责任移交给调用者。