목업 테스트
@SpringBootTest는 Loosly Coupled에 위반되는 사항이 많아서 @ExtendWith 애노테이션을 적용시키고 Mockito를 사용한 목업 테스트를 진행한다.
@SpringBootTest는 통합 테스트시에 사용한다. 단위 테스트시에 사용하는 것은 좋지 않다. 단위 테스트 시에 사용할 때는 classes 옵션을 통해 딱 필요한 클래스(스프링 빈)만 가져와서 사용해야한다.
가짜 목 객체를 만들어준다.(@Mock) 그 후 생성자를 사용해 위와 같이 사용할 수 있는데 다른 예시를 살펴보자.
생성자 주입과 유사한 코드이다.
@Mock
private OrderRepository orderRepository
@BeforeEach
void setUp() {
OrderService orderService = new OrderService(orderRepository);
}
이를 좀 더 간결하게 사용할 수 있도록 지원하는 애노테이션이 바로 @InjectMocks이다.
@Mock
private OrderRepository orderRepository;
@InjectMocks
private OrderService orderService;
이 두 코드는 기능적으로 동일하다.
SpringFramework 내부에 위치한 @MockBean이라는 애노테이션도 존재하는데 여기는 어떤 차이점이 있을까?
@MockBean을 사용하면 객체 내에 기존 등록된 Bean이 아닌 MockBean 즉, 가짜 빈을 주입해준다.
이는 @SpringBootTest, @WebMVCTest와 함께 사용하며 Mock과 마찬가지로 mock객체의 행위를 정의해줄 수 있다.
결론적으로 컨테이너가 테스트 시에 필요하고, Bean이 컨테이너에 존재한다면 @MockBean을 사용하고 그렇지 않은 경우에는 @Mock을 사용한다.
랜덤 숫자를 생성하는 GeneratorService를 목 객체로 만들고 QuizService에 주입해준다.
그 후 give을 통해 랜덤 숫자를 생성하고 willReturn을 통해 50, 30이 반환되도록 하였다.
그 후 Quiz내의 result(result = a * b)를 검증한다.
Spring Security