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절을 따로 모아준다.
'Java' 카테고리의 다른 글
테스트케이스의 대역 (0) | 2022.02.21 |
---|---|
TDD방법론 - 암호검사기4(WEAK CASE) (0) | 2022.02.13 |
TDD방법론 - 암호검사기2(NORMAL CASE) (0) | 2022.02.11 |
TDD방법론 - 암호검사기1(전체적인 틀) (0) | 2022.02.10 |
JDBC: CRUD 모두 구현 and 캡슐화 (0) | 2021.12.04 |