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ステータス値が変更され、次のテストメソッド「減算()」テストメソッドに影響を及ぼす可能性があるためです.
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;
}
}
Reference
この問題について(Java WebプログラミングNext Step 2章), 我々は、より多くの情報をここで見つけました https://velog.io/@ghks285/자바-웹-프로그래밍-Next-Stepテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol