Test코드 진행로 진행해보겠다.
코드 전체보기
package hello.core.beanfind;
import hello.core.AppConfig;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
public class ApplicationContextBasicFindTest {
AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("빈 이름 조회")
void findBeanName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class); // isInstanceOf : MemberServiceImpl.class가 memberService의 인스턴스인가.
}
@Test
@DisplayName("이름 없이 타입으로만 조회")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class); // isInstanceOf : MemberServiceImpl.class가 memberService의 인스턴스인가.
}
@Test
@DisplayName("구체 타입으로 조회")
void findBeanByName2() {
// 이건 구현에 의지한거라 좋지않음.. 역할에 의존하는게 좋음 => 유연성이 떨어지기 때문에
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class); // isInstanceOf : MemberServiceImpl.class가 memberService의 인스턴스인가.
}
@Test
@DisplayName("빈 이름으로 조회X")
void findBeanByNameX() {
// MemberService xxxx = ac.getBean("xxxx", MemberService.class); // 이걸 실행하면 "xxxx"라는 빈은 없기 때문에 NoSuchBeanDefinitionException라는 오류가 뜸
// () -> ac.getBean("xxxx", MemberService.class)를 실행했을 때, NoSuchBeanDefinitionException 에러가 뜨면 테스트 성공~!
assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("xxxx", MemberService.class));
}
}
등록된 스프링 빈 보기
AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
빈 이름으로 조회
📌 MemberService memberService = ac.getBean("memberService", MemberService.class);
"memberService"라는 이름을 가진 bean을 가져오는데 이것의 타입은 MemberService.class다.
📌assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
isInstanceOf : MemberServiceImpl.class 가 memberService의 인스턴스인가.
@Test
@DisplayName("빈 이름 조회")
void findBeanName() {
MemberService memberService = ac.getBean("memberService", MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
// isInstanceOf : MemberServiceImpl.class가 memberService의 인스턴스인가.
}
bean의 이름없이 타입으로만도 조회
@Test
@DisplayName("이름 없이 타입으로만 조회")
void findBeanByType() {
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class); // isInstanceOf : MemberServiceImpl.class가 memberService의 인스턴스인가.
}
구현체로 조회
유연성이 떨어지기 때문에 -> MemberServiceImpl.class(구현체)로 조회하는 것은 좋지않다.
역할에 의존하는게 좋다. 확장하기가 편하다.
@Test
@DisplayName("구체 타입으로 조회")
void findBeanByName2() {
// 이건 구현에 의지한거라 좋지않음.. 역할에 의존하는게 좋음 => 유연성이 떨어지기 때문에
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
assertThat(memberService).isInstanceOf(MemberServiceImpl.class); // isInstanceOf : MemberServiceImpl.class가 memberService의 인스턴스인가.
}
오류테스트 조회(없는 빈을 조회했을 경우)
📌 MemberService xxxx = ac.getBean("xxxx", MemberService.class);
📌 org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class, () → ac.getBean("xxxx", MemberService.class));
() -> ac.getBean("xxxx", MemberService.class)를 실행했을 때, NoSuchBeanDefinitionException 에러가 뜨면 테스트 성공~!
@Test
@DisplayName("빈 이름으로 조회X")
void findBeanByNameX() {
// 이걸 실행하면 "xxxx"라는 빈은 없기 때문에 NoSuchBeanDefinitionException라는 오류가 뜸
// MemberService xxxx = ac.getBean("xxxx", MemberService.class);
// () -> ac.getBean("xxxx", MemberService.class)를 실행했을 때, NoSuchBeanDefinitionException 에러가 뜨면 테스트 성공~!
org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,
() -> ac.getBean("xxxx", MemberService.class));
}
import static으로 추가
→ Alt + Enter를 하면 'Add on-demand static import for 'org.junit.jupiter.api.Assertions'게 뜬다.
이걸로 수정해주면 static으로 들어가고 코드가 깔끔해진다.
import static org.junit.jupiter.api.Assertions.*;
@Test
@DisplayName("빈 이름으로 조회X")
void findBeanByNameX() {
assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("xxxx", MemberService.class));
}
'공부 > Spring' 카테고리의 다른 글
[Spring] 스프링 빈 조회 - 상속 관계 (0) | 2023.11.07 |
---|---|
[Spring] 스프링 빈 조회 - 동일한 타입이 둘 이상일 때 (0) | 2023.11.07 |
[Spring] 스프링으로 전환하기 (0) | 2023.11.01 |
[Spring] IoC, DI, 컨테이너 (2) | 2023.10.04 |
[Spring] SOLID원칙(코드 예시) (0) | 2023.09.27 |