본문 바로가기

Java

TDD방법론 - 암호검사기3(코드정리)

WEAK 테스트코드를 작성하기전에 각 테스트당 중복되는 코드를 리팩토링한다.

 

 

매 테스트마다 PasswordStrengthMeter클래스의 인스턴스를 반복적으로 생성하기 때문에

인스턴스 생성코드를 필드로 이동시킨다.

암호확인로직도 공통적으로 meter()메소드와 assertEquals()메소드를 쓰고 입력값만 달라지기 때문에

이부분도 별개의 메소드로 분리해서 공통화할 수 있다.

 

public class PasswordStrengthMeterTest {
 
    private final PasswordStrengthMeter meter = new PasswordStrengthMeter();
 
    private void assertStrength(String password, PasswordStrength str) {
        PasswordStrength result = meter.meter(password);
        assertEquals(str, result);
    }
 
    @Test
    @DisplayName("모든 규칙을 충족하는 경우")
    void Strong() {
        assertStrength("12!@abAB", PasswordStrength.STRONG);
    }
 
    @Test
    @DisplayName("길이 8자 미만, 나머지 조건 충족")
    void normal_1() {
        assertStrength("ab12!@A", PasswordStrength.NORMAL);
    }
 
   //나머지 테스트코드 생략
}
 
cs

 

앞으로 테스트를 추가할때 assertStrength()메소드 한줄만 추가하면 된다.

 

public PasswordStrength meter(String s) {
        if (s.length() < 8) {
            return PasswordStrength.NORMAL;
        }
        boolean containsNum = checkNumber(s);
 
        if (!containsNum)
            return PasswordStrength.NORMAL;
        boolean containsUpp = checkUppercase(s);
        if (!containsUpp)
            return PasswordStrength.NORMAL;
        return PasswordStrength.STRONG;
    }
 
cs

meter()메소드 변경전

 public PasswordStrength meter(String s) {
        boolean lengthEnough = s.length() >= 8;
        boolean containsNum = checkNumber(s);
        boolean containsUpp = checkUppercase(s);
        if (!lengthEnough)
            return PasswordStrength.NORMAL;
        if (!containsNum)
            return PasswordStrength.NORMAL;
        if (!containsUpp)
            return PasswordStrength.NORMAL;
        return PasswordStrength.STRONG;
    }
 
cs

meter()메소드 변경후

 

개별 규칙을 검사하는 boolean변수들과 

규칙을 검사한 결과에 따라 암호강도를 계산하는 if절을 따로 모아준다.