2013-04-17 295 views
3

我想了解如何测试用户的输入(请注意我不是试图做一个模拟试验,但实际用户输入的测试)我怎样才能

目前在Java单元测试用户输入您可能会在我的程序中看到我硬编码了测试用例的值,并且它正在通过所有测试,但是如何获取用户输入并进行测试。

有没有一种方法可以在我的构造函数中调用System.in,并在测试类中创建MyClass1实例时传递它?

请尽可能给我一些示例代码,以便我能更好地理解。

如果我有一个接口,这样

public interface IMyClass{ 
    public int getvalue1(); 
    public int getvalue2(); 
    public int getvalue3(); 
} 

然后接口实现这样

public class MyClass1 implements MyClass{ 

private int _value1 = 0; 
private int _value2 = 0; 
private int _value3 = 0; 



public MyClass1(int number1, int number2, int number3) 
{ 

    _value1 = number1; 
    _value2 = number2; 
    _value3 = number3; 
} 

public void setLength1(int value1) 
{ 
    _value1 = value1; 
} 

public void setLength2(int length2) 
{ 
    _value2 = value2; 
} 

public void setLength3(int length3) 
{ 
    _value3 = value3; 
} 

public int getValue1() 
{ 
    return _value1; 
} 

public int getValue2() 
{ 
    return _value2; 
} 

public int getValue3() 
{ 
    return _value3; 
} 
} 

最后一个测试类这样:

public class ClasTest extends TestCase { 

public void testNumbers() 
{ 
    MyClass1 numbers= new MyClass1(1,2,3); 
    assertThat(numbers.getValue1(),is(not(numbers.getValue2()))); 

} 
} 

三江源,我很欣赏任何帮助。

+0

MVC,MVP?任何设计模式? – 2013-04-17 17:47:02

+0

我正在使用MVC。 – user1462617

+0

从测试的角度来看,您在测试中所做的是足够的。唯一可能的是随机生成基于随机输入的输入和测试。 – Markus

回答

0

用户Scanner类

public void testNumbers() 
{ 

    Scanner scan = new Scanner(System.in); 
    System.out.println("value1"); 
    int value1 = scan.nextInt(); 

    System.out.println("value2"); 
    int value2 = scan.nextInt(); 

    System.out.println("value3"); 
    int value3 = scan.nextInt(); 

    MyClass1 numbers= new MyClass1(value1, value2, value3); 
    assertThat(numbers.getValue1(),is(not(numbers.getValue2()))); 

} 
+0

我知道扫描仪类,但是如何测试它。在我的测试类中,我创建了类实例:MyClass1 numbers = new numbers(1,2,3)//这是默认构造函数。我不能做像数字(System.nextInt(),...)。 – user1462617

+0

编辑了答案。获取用户输入并将它们保存在变量中,然后将其传递给构造函数 – NullPointerException

+0

use scan.nextInt();如果你想从用户的int输入 – NullPointerException

5

使用System.setIn(new InputSteam());,然后写在传递给System.in

看到输入流:JUnit: How to simulate System.in testing?

单输入

String data = "Users Input"; 
System.setIn(new ByteArrayInputStream(data.getBytes())); 

Scanner scanner = new Scanner(System.in); 
System.out.println(scanner.nextLine()); 

结果

Users Input 

多输入

String data = "Users Input" + 
     "\nA second line of user input."; 
System.setIn(new ByteArrayInputStream(data.getBytes())); 

Scanner scanner = new Scanner(System.in); 
System.out.println("Line 1: " + scanner.nextLine()); 
System.out.println("Line 2: " + scanner.nextLine()); 

结果

Line 1: Users Input 
Line 2: A second line of user input. 
+0

你能分享一个使用System.setIn的例子吗?谢谢 – user1462617

+0

这只适用于一个输入。如果你需要多个输入(即程序提示输入几次,它不起作用) – CodyBugstein

+0

@Imray这是行不通的,查看更新的例子。您只需要将所有输入都放入输入数据中。 –

0

如果在UNIX

java MyProgram < sampleinput.txt

+0

我不在unix上,不知道多少unix。而我不是从.txt文件读取的。我正在从控制台读取。非常感谢 – user1462617

+0

@ user1462617,它重定向stdin以从示例文本文件而不是从控制台读取。 – djechlin

+0

是的,我明白这一点。这就是为什么我说我不是从文件中读取数据,而是从控制台 – user1462617