728x90
public enum PasswordStrength {
INVALID, WEAK, NORMAL, STRONG
}
enum은 상수의 집합으로 이루어진 객체이다.
비밀번호 안전도 검사 결과는 유효하지 않음, 약함, 보통, 강함 총 4개의 상수로 지정하였다.
public class PasswordStrengthMeter {
public PasswordStrength meter(String pw) {
if(pw == null || pw.isEmpty())
return PasswordStrength.INVALID;
int meetCounts = 0;
if(pw.length() >= 8)
meetCounts++;
boolean containsNumber = meetsContainigNumberCriteria(pw);
if(containsNumber)
meetCounts++;
boolean containsUppercaseChar = meetsContainigUppercaseCriteria(pw);
if(containsUppercaseChar)
meetCounts++;
if(meetCounts == 1)
return PasswordStrength.WEAK;
if(meetCounts == 2)
return PasswordStrength.NORMAL;
return PasswordStrength.STRONG;
}
private boolean meetsContainigNumberCriteria(String pw) {
for(char tmp : pw.toCharArray()) {
if(tmp >= '0' && tmp <= '9')
return true;
}
return false;
}
private boolean meetsContainigUppercaseCriteria(String str) {
for(char ch : str.toCharArray()) {
if(Character.isUpperCase(ch))
return true;
}
return false;
}
}
meter라는 함수를 통해 매개변수로 전달 받은 비밀번호의 안전도를 검사하였다.
비밀번호가 8자리 이상이고, 숫자, 대문자를 포함하면 Strong을, 그 중 2개의 조건만을 만족한다면 Normal을, 하나만 만족한다면 weak를, NULL이거나 빈 값이라면 invalid를 반환하였다.
char는 int 타입과 char 타입을 모두 저장할 수 있기 때문에, int 타입으로 형변환이 가능하고 비교 연산자를 사용할 수 있다.
char형 '0'의 아스키 코드는 48, '9'의 아스키 코드는 57이다.
Character의 isUpperCase(char ch)는 입력 받은 char가 대문자이면 true를 그렇지 않으면 false를 반환한다.
isLowerCase(char ch)는 입력 받은 char가 소문자이면 true를 그렇지 않으면 false를 반환한다.
public class PasswordStrengthTest {
private PasswordStrengthMeter meter = new PasswordStrengthMeter();
public void assertStrength(String password, PasswordStrength expStr) {
PasswordStrength result = meter.meter(password);
assertThat(result).isEqualTo(expStr);
}
@Test //요구 조건 만족
void meetsAllCriteria_Then_Strong() {
assertStrength("ab12!@AB", PasswordStrength.STRONG);
assertStrength("cd34!@CD", PasswordStrength.STRONG);
}
@Test //7자리 패스워드 테스트
void otherCriteria_expected_for_Length_Then_Normal() {
assertStrength("ab12!@A", PasswordStrength.NORMAL);
}
@Test //8자리 이상, 숫자 미 포함 시
void otherCriteria_expected_for_Number_Then_Normal() {
assertStrength("abcde!@A", PasswordStrength.NORMAL);
}
@Test //null
void nullInput_Then_Invalid() {
assertStrength(null, PasswordStrength.INVALID);
}
@Test //empty
void emptyInput_Then_Invalid() {
assertStrength("", PasswordStrength.INVALID);
}
@Test //대문자만 만족
void onlyUpperCase_Then_Weak() {
assertStrength("ABCD", PasswordStrength.WEAK);
}
@Disabled
@DisplayName("숫자만 만족")
@Test //숫자만 만족
void onlyNumber_Then_Weak() {
assertStrength("ABCD", PasswordStrength.WEAK);
}
@DisplayName("길이만 만족")
@Test //길이만 만족
void onlyLength_Then_Weak() {
assertStrength("ABCD", PasswordStrength.WEAK);
}
}
Display 어노테이션을 통해 Test 함수명을 알아보기 쉽게 표현할 수 있고, Disable 어노테이션을 통해 해당 test 함수를 잠시 실행시키지 않을 수도 있다.
728x90