Java WebプログラミングNext Step 2章


第1章テスト文字列計算機の実施


通常の動的計算に使用されるサービスコード(本番コード)とプライマリ(テスト)セクションは同じクラスにあります.
public class Call {

    int add(int a,int b){
        return a+b;
    }

    int minus(int a,int b){
        return  a-b;

    }
    public static void main(String[] args) {


        Call c=new Call();

        System.out.println(c.add(3,4));
        System.out.println(c.minus(5,2));


    }
}
Junitを使用してテストコードとサービスロジックを分離
assertEquals(期待値、メソッド実行結果値)で表されるメソッド
import static org.junit.jupiter.api.Assertions.assertEquals;
class StringCalTest {
    Call c=new Call();

    @Test
    void 덧셈(){
        assertEquals(5,c.add(3,2));
    }

    @Test
    void 뺄셈(){
        assertEquals(3,c.minus(5,2));
    }


}

서비스 로직 
public class Call {

    int add(int a,int b){
        return a+b;
    }

    int minus(int a,int b){
        return  a-b;

    }
    public static void main(String[] args) {

    }
}
テストコード
今回は、@BeforeAllクラスにインスタンスをバインドし、各実行時に実行できるようにします.
why?
これは、「加算()」テストメソッドを実行すると、callステータス値が変更され、次のテストメソッド「減算()」テストメソッドに影響を及ぼす可能性があるためです.
  • Junit 5@BeforeAllメソッドを使用する場合は、メソッドを静的、フィールドを静的に設定する必要があります.
    
    import static org.junit.jupiter.api.Assertions.assertEquals;
    class StringCalTest {
        private static Call c;
    
        @BeforeAll
        public static void setup(){
            c=new Call();
        }
    
        @Test
        void 덧셈(){
            assertEquals(5,c.add(3,2));
        }
    
        @Test
        void 뺄셈(){
            assertEquals(3,c.minus(5,2));
        }
    
    
    }

    結果



    1.文字列計算機の実装


    1)方法は一つの責任しか実現できない
    2)ピン深さを1段階に保つ
    たとえば
    void some(){
     while(true){
     if(true){
     		}
     	}
     }
    3)elseは使用しない

    2.NULL文字列またはNULL値を入力した場合は、0("=>0,null=>0)を返さなければなりません。


    問題がある場合は、入力値が表示され、文字列として入力が受信されるため、Stringタイプの文字列が受け入れられます.
    public class StringCalculator {
    
    
        //널값 or 빈문자열 입력할 경우 0을 반환
    
        int add(String text){
    
            if(text==null || text.isEmpty()){
                return 0;
            }
            return 0;
        }
    
    
    }
    テストコード
    import static org.junit.jupiter.api.Assertions.assertEquals;
    class StringCalTest {
    
    
        private static StringCalculator s;
    
        @BeforeAll
        void setup(){
            s=new StringCalculator();
        }
        @Test
        void 빈문자_널값체크(){
            assertEquals(0,s.add(""));
            assertEquals(0,s.add(null));
        }
    
    }

    結果



    3.文字列として数値を入力すると、その数値が返されます(「1」=>1)。


    文字列に(text)数字がある場合は、変換できます.
    public class StringCalculator {
    
    
        //널값 or 빈문자열 입력할 경우 0을 반환
    
        int add(String text){
    
            if(text==null || text.isEmpty()){
                return 0;
            }
            return Integer.parseInt(text);
        }
    
    
    }
    テストコード
    import static org.junit.jupiter.api.Assertions.assertEquals;
    class StringCalTest {
    
    
        private static StringCalculator s;
    
        @BeforeAll
        void setup(){
            s=new StringCalculator();
        }
      
        @Test
        void 숫자체크(){
            assertEquals(1,s.add("1"));
        }
    }

    結果



    4.カンマ(,)区切り記号として2つの数値を入力すると、2つの数値の合計が返されます(「1,2」=>3)


    まず、
  • 文字列カンマを区切ります.
    次に、文字列配列を作成し、","に従って平滑化し、
  • の値を加算します.
  • 文字列->変換文字列後
  • 文字列->整数
  • に変換
    public class StringCalculator {
        
        //널값 or 빈문자열 입력할 경우 0을 반환
        int sum=0;
        int add(String text){
    
            if(text==null || text.isEmpty()){
                return 0;
            }
            if(text.contains(",")){
            
                String values[]=text.split(",");
                
                for(String val:values){
                  sum+=Integer.parseInt(val);  
                }
                return sum;
            }
            return Integer.parseInt(text);
        }
    }
    テストコード
    import static org.junit.jupiter.api.Assertions.assertEquals;
    class StringCalTest {
    
    
        private static StringCalculator s;
    
        @BeforeAll
       static void setup(){
            s=new StringCalculator();
        }
    
        @Test
        void 숫자_2개비교(){
            assertEquals(3,s.add("1,2"));
        }
    }

    結果



    5.カンマ(,)区切り記号として2つの数値を入力すると、2つの数値の合計("1,2"=>3)=>再パッケージ


    1)数値の処理
    2)カンマ区切り文字を含む場合の個別処理
    import java.util.Scanner;
    
    public class Calcuator {
    
    
        int sum=0;
        int sum(String []text){
    
    
            for(String s: text){
                sum+=Integer.parseInt(s);
            }
    
            return sum;
        }
    
    
        int add(String text) {
    
            if (text == null || text.isEmpty()) {
                return 0;
            }
    
            String []str=text.split(",");
            return sum(str);
        }
    
    
        }
    
    
    テストコード
    
        @Test
        void 숫자1개_쉼표구분자(){
    
            assertArrayEquals(new String[] {"1"},"1".split(","));
            assertArrayEquals(new String[] {"1","2"}, "1,2".split(","));
        }
    ifセグメントを削除すると、コード全体がきれいになります
    でもsum()メソッドには2つの役割があります
    1.文字配列を数値に変換
    2.数字配列の和を求める操作
    方法によって一つの責任しか負わない原則に従って、二つを分ける.
    public class Calcuator {
    
        int sum=0;
    
    
        int add(String text) {
    
            if (text == null || text.isEmpty()) {
                return 0;
            }
            String []vales=text.split(",");
            return sum(tolns(vales));
        }
    
        
        private int[] tolns(String []value){
            int []numbers=new int[value.length];
            for(int i=0; i<value.length; i++){
                numbers[i]=Integer.parseInt(value[i]);
            }
            return numbers;
        }
    
    
        private int sum(int number[]){
            for(int n: number){
                sum+=n;
            }
            return sum;
        }
    
    
    }
    読みにくいコードになり、より極端な再構築を行います.
    上のコードを読みやすくします
    1.値がNULLの場合は、0に変換して->数値を返して合計します.
    2.値が空であるかどうかを確認するboolean
    3.空でない場合は、セパレータに分離
    public class Calcuator {
    
        int sum=0;
    
    
        int add(String text) {
            
            if(isBlank(text)){
                return 0;
            }
            return sum(tolns(split(text)));
        }
    
        private int[] tolns(String []value){
            int []numbers=new int[value.length];
            for(int i=0; i<value.length; i++){
                numbers[i]=Integer.parseInt(value[i]);
            }
            return numbers;
        }
    
    
    
        private boolean isBlank(String text){
            return text==null|| text.isEmpty();
        }
    
        private String[]split(String text){
            return text.split(",");
        }
        private int sum(int number[]){
            for(int n:number){
                sum+=n;
            }
            return sum;
        }
    
    
    }
    

    6.RuntimeExceptionを使用した例外処理(つまり、負の値を渡すと例外が処理される)


    JUnit 5は@Test(期待=?)いけません.
    @Test(expected = RuntimeException.class)
    public void add() throws Exception{
    
    	cal.add("-1,2,3"); 
    }
    junit 5はramda式で実現できる
    @Test
    public void add() throws Exception{
    	RuntimeException exception = assertThrows(RuntimeException.class,()->{
        
        	cal.add("-1,2,3");
        });
    }
    public class Calcuator {
    
        int sum=0;
    
    
        int add(String text) {
    
            if(isBlank(text)){
                return 0;
            }
            return sum(tolns(split(text)));
        }
    
        private int[] tolns(String []value){
            int []numbers=new int[value.length];
            for(int i=0; i<value.length; i++){
                numbers[i]=toPositive(value[i]);
            }
            return numbers;
        }
    
        private boolean isBlank(String text){
            return text==null|| text.isEmpty();
        }
    
        private String[]split(String text){
            return text.split(",|:");
    
        }
        private int sum(int number[]){
            for(int n:number){
                sum+=n;
            }
            return sum;
        }
    
        private int toPositive(String value){
            int num=Integer.parseInt(value);
    
            if(num < 0){
                throw new RuntimeException();
            }
    
            return num;
        }
    }