2013-04-17 86 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