본문 바로가기

TIL

[TIL] 🌱 2023.03.31 - Mock? MockBean?

🛹 목표

목표 난이도 달성 여부
토비 스프링 😖 ✔️
패스트 캠퍼스 강의 듣기 🥺 ✔️
알고리즘 문제풀이 😘 ✔️

📋 공부 내용 & 기록

싱글톤 패턴의 한계

1. private 생성자를 갖고 있기 때문에 상속할 수 없다.

- private 생성자는 다른 생성자가 없는 이상 상속이 불가능하다.

2. 싱글톤은 테스트하기 힘들다.

- 싱글톤은 만들어지는 방식이 제한적이기 때문에 테스트에서 사용될 때 mock 오브젝트 등으로 대체하기 힘들다.

3. 서버환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다.

- 서버에서 클래스 로더를 어떻게 구성하고 있느냐에 따라 싱글톤 클래스임에도 하나 이상의 오브젝트가 만들어 질 수 있다.

- 여러 개의 JVM에 분산돼서 설치가 되는 경우에도 각각 독립적으로 오브젝트가 생기기 때문에 싱글톤으로서의 가치가 떨어진다.

4. 싱글톤의 사용은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다.

- 싱글톤의 static 메서드를 이용해 언제든지 싱글톤에 쉽게 접근할 수 있기 때문에 애플리케이션 어디서든지 사용될 수 있고, 그러다 보면 자연스럽게 전역상태로 사용되기 쉽다.

 

Mock VS MockBean

 

Mockito @Mock @MockBean @Spy @SpyBean 차이점

예제 코드 https://github.com/cobiyu/MockitoSample Test Double이 왜 필요한 지부터 시작하는 기본적인 테스트 코드부터 한 단계씩 발전시켜나가며 Mockito의 어노테이션들의 정확한 쓰임새에 대해 살펴보겠습

cobbybb.tistory.com

  • @Mock은 @InjectMocks에 대해서만 해당 클래스 안에서 객체를 찾아서 의존성을 해결
  • @MockBean은 mock 객체를 스프링 컨텍스트에 등록하는 것이기 때문에 @SpringBootTest를 통해서 @Autowired가 동작할 때 등록된 mock 객체를 사용하도록한다.
  • @Mock은 테스트 코드에서 원하는 행위를 작성하여 테스트에서 원하는 상황을 설정하도록 하는 어노테이션
  • @Spy는 실제 기능을 그대로 사용하고 싶은 경우에 사용한다.
  • @SpyBean이 Interface일 경우에는 해당 Interface를 구현하는 실제 구현체가 꼭 스프링 컨텍스트에 등록되어 있어야 한다. 등록되지 않았다면 @MockBean을 사용하는 것이 낫다. 

GenerationType의 Sequence와 Identity의 차이

 

@SpringBootTest / @DataJpaTest 차이점 과 JPA 영속성 컨텍스트

Memory db를 이용한 Repository Test Repository layer의 테스트를 위해서 내장 Memory DB를 많이 사용합니다. Memory DB 를 사용하는 방법도 천차만별일텐데 크게는 2가지 정도라 생각됩니다. @SpringBootTest+ Memory DB

cobbybb.tistory.com