使用Junit模拟用户对Scanner对象的输入

时间:2016-04-08 23:45:08

标签: java unit-testing junit system-rules

我对JUnit和单元测试非常陌生,并且有一个关于模拟Scanner对象的用户输入的问题。我有以下代码,我想测试。非常基本。

运行代码

import java.util.Scanner;

public class MyGame{
    public MyGame() {
        Scanner response = new Scanner(System.in);

        int game;

        System.out.println("Enter a game.");
        System.out.println("Press 1 for Super Awesome Bros.");
        System.out.println("Press 2 for a Random game.");

        game = response.nextInt();

        if (game == 1){
            System.out.println("Super Awesome Bros.");
    }
  }
}

这是我的Testcase

import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.contrib.java.lang.system.StandardOutputStreamLog;
import org.junit.contrib.java.lang.system.TextFromStandardInputStream;
import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.contrib.java.lang.system.TextFromStandardInputStream.*;

@RunWith(JUnit4.class)
    public class Testsuite {

      @Rule
      public final StandardOutputStreamLog out = new StandardOutputStreamLog();

      @Rule
      public final TextFromStandardInputStream in = emptyStandardInputStream();

  @Test
  public void printOutput() {
    in.provideText("1\n");
    new MyGame();
    assertThat(out.getLog(), containsString("Super Awesome Bros."));
  }

}

所以在我的Testcase中,我试图将输入模拟为1,这样我就能收到预期的输出。但由于某些原因,无论输出是什么,我的代码都会通过。我不确定我做错了什么。如果输出不符合预期,则测试应该失败。有人能发现问题吗?我再次尝试掌握JUnit和单元测试。我主要使用Python进行测试。感谢所有先进的人。

1 个答案:

答案 0 :(得分:0)

你的考试总是在考试,因为你总是在写“字符串为超级真棒兄弟按1”。因此检查

assertThat(out.getLog(), containsString("Super Awesome Bros."));
总是匹配

顺便说一句,你不必写@RunWith(JUnit4.class)。你可以删除该行。