작성
·
328
3
안녕하세요! 강의 너무 재밌게 잘 듣고 있습니다. 몇가지 질문이 있는데요!
1. OrderServiceImplTest의 createOrder() 가 순수한 자바로 테스트하는 코드라고 하셨는데, 정확히 그 의미가 어떤 것 인가요?? 스프링 컨테이너를 생성해서 getBean(OrderService.class) 이런식으로 받아오지 않고 new OrderServiceImpl()로 생성해서 테스트하기 때문인가요??
2. 4분 28초쯤에 createOrder() 테스트를 실행하면 오류가 나서 선생님께서 AppConfig의 orderService()의 return을 null로 바꾸셨습니다. 저는 createOrder()에서 new orderServiceimpl() 생성자를 호출하면 OrderServiceImpl 클래스의 디폴트 생성자가 호출된다고 생각했는데, 오류가 왜 AppConfig에서 나는 건가요?? 왜 저기 코드를 고쳐야하는건지 이해가 잘 가지 않습니다ㅠㅠ
답변 1
2
2번에서 OrderServiceImpl(a,b) 형태의 생성자를 주석처리하고 수정자 주입 코드로 변경하게 되면서, AppConfig 내 OrderServiceImpl( a, b) 형태의 생성자는 사용할 수 없기 때문에 null을 리턴했다는 것은 이해가 갔습니다.
1. OrderServiceImplTest createOrder() 테스트를 실행하는 도중에 AppConfig쪽에 오류가 난 것이 아니라, AppConfig 자체에서 OrderServiceImpl(a,b)형태의 생성자가 없는데 사용을 해서 컴파일 오류가 나는 것을 고친 것이라고 이해하면 될까요??? OrderServiceImplTest에서 하는 테스트는 순수 자바 코드로 테스트하는 것이니 AppConfig와는 상관이 없는게 맞는 건가요??
2. 아래 링크의 질문의 답변에 의문이 있어 질문드립니다.
https://www.inflearn.com/questions/474564
저 답변 내용에 따르면, 원래 아래코드에서 3번째 줄 코드를 아래와 같이 했을때, 정상작동한다고 했습니다.
OrderServiceImpl orderService = new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
이 코드에서 new MemoryMemberRepository()를 해도 MemoryMemberRepository 는 클래스에 @Component 애노테이션이 붙어있어 이미 스프링 빈으로 등록되어있어 싱글톤으로 관리되므로 같은 객체를 반환하기 때문에 save가 제대로 동작한 것이라고 이해했습니다.
그런데, getBean()으로 얻어온 객체아 아니라 하더라도 결국엔 new로 생성된 MemoryMemberRepository가 스프링 빈으로 등록된 것이면 이를 사용하면 순수 자바 코드로 테스트 하는게 아니지 않나요???
여기 코드에서는 ApplicationContext ac = new ~ 이런식으로 스프링 컨테이너를 생성하지 않았는데, MemoryMemberRepository 스프링 빈은 어디에서 관리되는건가요??