종속성이란 무엇입니까? (의존)
- 한 객체가 수행할 작업을 다른 객체에 위임하는 순간 발생하는 두 객체 간의 관계입니다.
의존성 주입
- 외부에서 객체 간의 종속성을 강제하여 생성 및 사용에 대한 책임을 분리합니다.
- 인스턴스 생성 책임: 외부
- 인스턴스 사용 담당: 주입할 객체
기존 방식
- 객체가 사용할 객체의 인스턴스를 직접 생성하여 사용하는 방법
예제 코드
public class AmOrPmCheckerTest {
public boolean isAm() {
final Calendar currentDate = Calendar.getInstance();
final int hour = currentDate.get(Calendar.HOUR_OF_DAY);
if (hour < 12) {
return true;
}
return false;
}
}
테스트 코드
class AmOrPmCheckerTest {
@Test
void isAmTrue() {
final AmOrPmChecker amOrPmChecker = new AmOrPmChecker();
Assertions.assertThat(amOrPmChecker.isAm()).isTrue();
}
@Test
void isAmFalse() {
final AmOrPmChecker amOrPmChecker = new AmOrPmChecker();
Assertions.assertThat(amOrPmChecker.isAm()).isFalse();
}
}
문제
- 현재 시간에 따른 Calendar 개체는 컴파일 타임에 결정됩니다.
(두 물체 사이의 강한 결합)
- 참 테스트와 거짓 테스트는 동시에 불가능합니다.
DI를 통한 해상도
- Calendar 개체를 메서드 매개 변수로 전달합니다.
- 외부에서 종속성을 주입하기 때문에 테스트가 가능합니다.
예제 코드
public class AmOrPmChecker {
public boolean isAm(final Calendar currentDate) {
final int hour = currentDate.get(Calendar.HOUR_OF_DAY);
if (hour < 12) {
return true;
}
return false;
}
}
테스트 코드
class AmOrPmCheckerTest {
@Test
void isAmTrue() {
//given
final AmOrPmChecker amOrPmChecker = new AmOrPmChecker();
final Calendar current = Calendar.getInstance();
current.set(Calendar.HOUR_OF_DAY, 10);
//when
//then
Assertions.assertThat(amOrPmChecker.isAm(current)).isTrue();
}
@Test
void isAmFalse() {
//given
final AmOrPmChecker amOrPmChecker = new AmOrPmChecker();
final Calendar current = Calendar.getInstance();
current.set(Calendar.HOUR_OF_DAY, 13);
//when
//then
Assertions.assertThat(amOrPmChecker.isAm(current)).isFalse();
}
}