2017-05-15 12 views
0

テスト駆動型の開発割り当て用のテストスイートが提供されました。プログラムはロック、ペーパー、はさみのゲームをプレイし、実際のプログラムの骨格コードも与えられました。私はテストスイートを変更するつもりはありませんが、代わりにテストをパスするように実際のプログラムでコードを変更したり変更したりしなければなりません。私はgetInputメソッドを通過する際に問題を抱えています。 これは、実際のプログラムのコードです:テスト駆動型開発、Java、アサーションエラーで固執

public static char getInput(String prompt, char[] options, Scanner sc) { 
// getInput method 
// prompts user for an input that matches one of the given characters 
// if its not one of those, repeat. (use contains (above)) 
char c; 
boolean flag = false; 
do { 
    c = sc.next().charAt(0); 
    if (contains(c, options)) { 
    System.out.println(prompt + " (y, n, q):"); 
    flag = true; 
    } 
} 
while (!flag); 
return c; 
} 

これは、か、getInputメソッドをテストするためのテストスイートの方法である: `

private static void testGetInput() { 
    OutputStream out; 

out = resetSystemOut(); 
assert 'y' == RPS.getInput("Choose", new char[] {'y','n','q'}, new Scanner("y\n")); 
assertOutput("Choose (y, n, q):\n", out); 
out = resetSystemOut(); 
assert 'n' == RPS.getInput("Alice", new char[] {'y','n','q'}, new Scanner("n\n")); 
assertOutput("Alice (y, n, q):\n", out); 
out = resetSystemOut(); 
assert 'q' == RPS.getInput("Bob", new char[] {'y','n','q'}, new Scanner("q\n")); 
assertOutput("Bob (y, n, q):\n", out); 
out = resetSystemOut(); 
assert 'q' == RPS.getInput("Cloe", new char[] {'y','n','q'}, new Scanner("x\nw\nq\n")); //line 81 
assertOutput("Cloe (y, n, q):\n" + 
    "Cloe (y, n, q):\n" + 
    "Cloe (y, n, q):\n", out); 
out = resetSystemOut(); 
assert 'v' == RPS.getInput("Doug", new char[] {'v'}, new Scanner("vvvv\nv\n")); 
assertOutput("Doug (v):\n" + 
    "Doug (v):\n", out); 
} 

は、これは私が取得していますエラーです:

Exception in thread "main" java.lang.AssertionError: 54 18 
Cloe (y, n, q): 
Cloe (y, n, q): 
Cloe (y, n, q): 
Cloe (y, n, q): 

     at RPSTester.assertOutput(RPSTester.java:226) 
     at RPSTester.testGetInput(RPSTester.java:81) 
     at RPSTester.main(RPSTester.java:25) //line 25 has a call to the testGetInput method 

私は就業時間中に講師を訪問しましたが、その質問に対する答え全体を明らかにする前に教えてくれる人がいます。私は何か助け、ヒント、私の間違いの指摘に感謝します。何かが評価されます。

答えて

0

ような何かを行う必要があります。あなたは、あなたのテストアサーションに合うように改行文字\ nの追加を調整しなければならないかもしれません。

これは役立つはず:

public static char getInput(String prompt, char[] options, Scanner sc) { 
     // getInput method 
     // prompts user for an input that matches one of the given characters 
     // if its not one of those, repeat. (use contains (above)) 
     char c; 
     boolean flag = false; 
     String printStr = prompt + " ("; 
     for (int i = 0; i < options.length; i++) { 
      printStr += " " + options[i] + ","; 
     } 
     printStr = printStr.substring(0, printStr.length() - 1) + "):\\n"; 

     do { 
      c = sc.next().charAt(0); 
      System.out.println(printStr); 
      if (contains(c, options)) { 
       flag = true; 
      } 
     } 
     while (!flag); 
     return c; 
    } 
+0

私はテストスイートを変更することはできませんが、テストスイートのアサーションを渡すためにgetInputメソッドのコードを変更する必要があります – dianite1337

+0

それに応じて私の応答を更新 – ayip

0

あなたはスキャナ入力中の文字倍のように多くの数をプロンプトとオプションの文字を連結することによって、print文を構築し、その文を印刷する必要がある。この

while(scanner.hasNext()) { 
    String input = scanner.next(); 
    //check if input equals to y or n or q . If yes then break 
    // otherwise System.out.println(prompt + " (y, n, q):") 
} 
+0

をしかし、私はそれを行う場合に予想される出力であるため、プロンプト「ダグ」を持っている第五assert文は、失敗します「ダグ(V):」私たちは意志"Doug(y、n、q):" – dianite1337

+0

なぜ "Doug(v)"の出力は "Doug(v)"ですか? vは有効な入力ですか? – tabiul

+0

はい、vは有効な入力です。これは、指定されたコードの5番目のassert文で引数として渡されるものです。各アサーションテストでオプションの配列が作成されていますが、最初の4回のテストでは同じように起こります。 – dianite1337

関連する問題