테스트 코드란 뭐고 언제 쓰면 좋은걸까?
: 실제 코드가 정상적으로 동작하는지 검증하는 코드(기대한 대로)
➡️ 나중에 수정이나 리팩토링을 해도 기존 기능이 잘 유지되는지 확인할 수 있다!!
만약 내가 비밀번호 암호화하는 메서드를 만들었는데, 이게 제대로 작동하는게 맞는지 검증하고 싶다!
그때 아래의 코드를 작성해볼 수 있따
PasswordEncoder encoder = new PasswordEncoder();
String encoded = encoder.encode("1234");
boolean result = encoder.matches("1234", encoded);
이 코드가 기대하는 결과는 result == true
근데 이걸 매번 직접 실행해서 눈으로 확인하면 너무 귀찮음,,,, 그리고 메모리 낭비도 심하고ㅜㅜ
➡️ 그래서 테스트 코드를 만들어 놓고, test 버튼만 누르면 자동으로 확인될 수 있게 만드는 것!!

우리가 코드를 짜는 곳은 main
테스트를 진행할 패키지는 바로 test이다~!
테스트코드를 작성할 때는, given-when-then 패턴을 준수하는 것이 중요하다!!
패턴으로 나눔으로써 개발자가 편리하게 확인할 수 있기 때문
given - 테스트 준비 : 입력값 설정, 객체 생성 등
when - 실제 실행 : 테스트 대상 메서드 호출
then - 결과 검증 : 예상한 값과 실제 결과 비교
@Test
void 테스트_이름() {
// given
// 준비물 만들기
// when
// 메서드 실행
// then
// 결과 검증
}
그럼 이 패턴을 활용해서 테스트 코드를 만들어보자
실습으로 이해해보자!
프로젝트에서 src/test 패키지 내부에서 만들면 된다. 우선 test 패키지로 이동!
테스트하고 싶은 클래스와 같은 패키지 구조를 만든다
main에 org.example.expert.config.PasswordEncoder가 있다면
테스트는 test에 org.example.expert.config.PasswordEncoderTest로 만든다.
src
├── main
│ └── java
│ └── org
│ └── example
│ └── expert
│ └── config
│ └── PasswordEncoder.java
└── test
└── java
└── org
└── example
└── expert
└── config
└── PasswordEncoderTest.java ← 여기에 만들기!
그리고 이제 클래스 내부에 코드를 만들어보자
@ExtendWith(SpringExtension.class) -> 나 스프링에서 이거 테스트 클래스다~~!!!
@InjectMocks 테스트할 대상을 주입해주기 (이름부터 주입한다 mock임)
@Test 그리고 테스트할 메서드 위에 나 이거 테스트코드아!!!라고 해주기
@ExtendWith(SpringExtension.class) //📢 스프링 환경에서 테스트할 거야!!라고 알려주는 어노테이션
class PasswordEncoderTest {
@InjectMocks // ✅ 테스트 대상 객체를 테스트 클래스에 주입(필요하면 mock도 함께 주입)
private PasswordEncoder passwordEncoder; // ← 테스트할 대상!
@Test
void 테스트코드메서드명() {
// given
// when
// then
}
}
📌 given-when-then 구조로 테스트 작성하는거 잊지 말기!
그리고 마지막으로
이렇게 실행해주면

이렇게 성공 뜨는걸 확인할 수 있다!
private PasswordEncoder passwordEncoder;이 객체가 잘 작동하는지 알아보자
1. given
String rawPassword = "testPassword";
String encodedPassword = passwordEncoder.encode(rawPassword);
환경을 주자
테스트할 rawPassword를 주고, 암호화해서 준비!
2. when
boolean matches = passwordEncoder.matches(rawPassword, encodedPassword);
이거 일치하니? 라고 물어보기
3. then
assertTrue(matches);
✅ assertTrue()란?
assertTrue(조건식);
➡️ 말 그대로 "이 조건이 참(true)이길 기대한다!" 라는 뜻
테스트 결과로 true가 나와야 테스트가 성공하고,
false가 나오면 테스트가 실패
=> 테스트코드에서 많이 쓰인다
| 메서드 | 설명 |
|---|---|
| assertTrue(조건) | 조건이 true면 테스트 통과 |
| assertFalse(조건) | 조건이 false면 테스트 통과 |
| assertEquals(a, b) | a와 b가 같아야 테스트 통과 |
| assertNotNull(객체) | 객체가 null이 아니어야 통과 |