2016-09-19 11 views
0

私はこのようになりますプログラム書いた:私は基本的に試してみて、様々な入力でテストを通じて私のプログラムを「ブレーク」するJUnitテストケースを書いて使命を帯びてきたJUnitテストケースからプログラムに複数の入力をシミュレートするにはどうすればよいですか?

import java.util.Scanner; 
import java.util.ArrayList; 

public class Triangles { 

    public static void main(String[] args) { 

     Scanner user_input = new Scanner(System.in); 

     ArrayList<String> triangleLengths = new ArrayList<String>(); 

     for (int i=0; i < 3; i++) { 

      System.out.print("Triangle length #" + i + ": "); 
      triangleLengths.add(i,user_input.next()); 
     } 

     if (triangleLengths.get(0) == triangleLengths.get(1) && triangleLengths.get(1) == triangleLengths.get(2)) { 

      System.out.println("This triangle is an equilateral triangle"); 

     } else if (triangleLengths.get(0) == triangleLengths.get(1) || triangleLengths.get(0) == triangleLengths.get(2) || triangleLengths.get(1) == triangleLengths.get(2)) { 

      System.out.println("This triangle is an isosceles triangle"); 

     } else if (triangleLengths.get(0) != triangleLengths.get(1) && triangleLengths.get(1) != triangleLengths.get(2)) { 

      System.out.println("This triangle is a scalene triangle"); 

     } else { 

      System.out.println("The input does not make a triangle!"); 

     } 


    } 

}

を。私は私の人生のために、これをJavaの初心者全体としてどのようにするかを考え出すことはできません。誰かが私を正しい方向に向けることができますか?

+0

あなたが求めているのではなく、入力が三角形を作ることができないときを把握するための論理はちょっとありません。最も長い長さが他の2つの長さの合計以上であれば、3つの長さは三角形を作ることができないので、そこにいくつかの算術が必要です。 –

答えて

1

私はそれを解決する方法を提案しました。

あなたは、手動で入力する必要なしに異なるパラメータで自動的にテストできるようにしたいので、私は以下のように三角形部分を分離しました。

編集:私は、コードをやり直しやや

通常の実行クラスのsrc/main.java

JUnitのクラステスト/ TrianglesTest.java

import org.junit.Test; 

import java.util.Arrays; 
import java.util.List; 

import static org.junit.Assert.assertEquals; 

public class TrianglesTest { 

    /** 
    * Testing with String inputs (what you'd enter manually) 
    */ 
    @Test 
    public void testWithStrings() { 
     List<String> triangleLengths = Arrays.asList("len1", "len2", "len3"); 

     Triangle subject = new Triangle(triangleLengths); 
     // Example of checking if expected type 
     assertEquals(Triangle.Type.ISOSCELES, subject.getTriangleType()); 
    } 

    /** 
    * Testing with numbers as what I'd expect the triangle to be made of 
    * 
    * Here you test with a triangle object 
    * 
    * Haven't tested what the 3 types is sorry :O 
    */ 
    @Test 
    public void testWithNumbersAsObject() { 
     Triangle subject = new Triangle(4, 5.32, 7); 
     assertEquals(Triangle.Type.SCALENE, subject); 
    } 

    /** 
    * This piece you check the static method but have no object 
    */ 
    @Test 
    public void testWithNumbersStaticMethod() { 
     assertEquals(Triangle.Type.ISOSCELES, Triangle.getTriangleType(3.4d, 4d, 1.111d)); 
    } 
} 

最後に、あなたが望む実際のコードテストするためにのsrc/Triangles.java

import java.util.List; 

/** 
* I created so you can both have an object of the triangle or make the check purely static 
* maybe you need an object type for later? 
*/ 
public class Triangle { 

    final double side0; 
    final double side1; 
    final double side2; 

    public Triangle(List<String> triangleLengths) { 
     this(Double.parseDouble(triangleLengths.get(0)), 
       Double.parseDouble(triangleLengths.get(1)), 
       Double.parseDouble(triangleLengths.get(2))); 
    } 

    public Triangle(double side0, double side1, double side2) { 
     this.side0 = side0; 
     this.side1 = side1; 
     this.side2 = side2; 
    } 

    public Triangle.Type getTriangleType() { 
     return Triangle.getTriangleType(side0, side1, side2); 
    } 

    public static Triangle.Type getTriangleType(double side0, double side1, double side2) { 
     if (isEquilateral(side0, side1, side2)) { 
      return Type.EQUILATERAL; 
     } else if (isIsosceles(side0, side1, side2)) { 
      return Type.ISOSCELES; 
     } else if (isScalene(side0, side1, side2)) { 
      return Type.SCALENE; 
     } else { 
      return Type.INVALID; 
     } 
    } 

    private static boolean isScalene(double side0, double side1, double side2) { 
     return side0 != side1 && side1 != side2; 
    } 

    private static boolean isIsosceles(double side0, double side1, double side2) { 
     return side0 == side1 || side0 == side2 || side1 == side2; 
    } 

    private static boolean isEquilateral(double side0, double side1, double side2) { 
     return side0 == side1 && side1 == side2; 
    } 

    public enum Type { 
     EQUILATERAL, 
     ISOSCELES, 
     SCALENE, 
     INVALID 
    } 
} 

は、この情報がお役に立てば幸いです。

私はTriangleクラスから即座にそれを書き出す代わりに答えを返すことに注意してください。そして手動で実行する場合にのみ、私はそれをメインメソッドから書き出します。

+0

ニースの答え:あなたは良い説明をする。実行可能なソリューションです。私が違うしかないのは唯一のことです:彼のようにフォーマットするのは怠惰ではありません。意味:何も理由のない空白行は役に立ちません。あなたはあなたの答えを編集して、例えばそれらを取り除くことができます。そして、記録のために:そのメソッドはすでに複数回戻っています:あなたは、** else **のものはまったく必要ありません!ちょうど一連の 'if(something){then return}'のために行ってください。これはかなりの "ロジック"と読み込み作業を節約します。ずさんなコーディングについては申し訳ありません - 真 – GhostCat

+0

ああいやが、後で今日少し:)ちょうどそれのための一般的なパターンは、彼の例を使ってどのように見えるか、彼を示し断食したかったということでしょう、彼のコード – Wisienkas

+0

のビット高速なリファクタリングが応答を感謝しました習慣、私はちょうど学んでいます。ちょうど速いもの - ここでmethodNameを書いたところ - どのメソッド名を参照していますか? –

0

Wisienkasの回答はすぐに現れます。もう少し概念的な背景が役立つと思います。

コードを開始するときに、stdinの「ユーザー入力」がスキャナを使用して表示されます。「大きなもの」のようです。あなたは何らかの価値を得て、その上で何らかの処理を行います。いくつかの結果を印刷します。

問題は、「実際の世界」の仕組みではないことです。あなたはあなたのコードがテスト可能ではないというその問題に遭遇しました。ここで理解すべき重要なことは、物事をより良くするために、ほんの少しの抽象化が必要なことです。

ものは以下のとおりです。

  1. あなたの「処理」のコードは、独自のクラスやメソッドに入ります。理想的には、呼び出されたときに引数として動作するデータ以外のメソッド。
  2. "処理中"コードは結果を返す必要があります。 System.outに印刷するだけで、コードが何をしているのかを確認することはほとんど不可能です。
0

あなたがするための最善のことは、あなたのコードを再設計することであるので、

  • 三角ロジックは独自のクラスであり、ユーザ入力ロジックは、独自の方法である
  • mainの方法は絶対に最小です。

次に、三角形ロジックとユーザー入力ロジックを個別にテストできます。 mainが十分小さい場合は、単体テストを書かずに立ち去ることができます。

しかし、それはあなたが尋ねないです。あなたのコードあなたがそれを書いているとおりに正確にを維持したい場合は、あなたが入力と出力を制御ストリームにSystem.inSystem.outを設定することで、それをテストすることができます。

あなたのテストクラスは、次のようになります。これにより、各テストで指定するStringから読み取るようにSystem.inがリダイレクトされ、後で内容を確認できるストリームに書き込むにはSystem.outが書き込まれます。

public class TrianglesTest { 
    @Test 
    public void identifiesEquilateralTriangle() { 
     ByteArrayOutputStream output = setStreams("5 5 5 "); 
     Triangles.main(new String[0]); 
     assertEquals("This triangle is an equilateral triangle", output.toString().trim()); 
    } 

    // Plus a whole lot more tests for other cases 

    private ByteArrayOutputStream setStreams(String input) { 
     System.setIn(new ByteArrayInputStream(input.getBytes())); 
     ByteArrayOutputStream toReturn = new ByteArrayOutputStream(); 
     System.setOut(new PrintStream(toReturn)); 
     return toReturn; 
    } 
} 
+0

三角ロジックを独自のクラスにして、ユーザーが独自のメソッドを入力する方法を提案してください。 –

+0

Wisienkasの答えを見てください。彼はかなり良いTriangleクラスを書いていますが、それは元のコードと同じ論理エラーがまだありますが、私はその質問の下で私のコメントで指摘しました。 –

+0

私はwisienkas'コードを使用している、と私が得るすべては 『型にトライアングルを解決できませんでした』のようなものを言って、エラーがたくさんあり、このの私の小さな経験で、それは –

関連する問題