Closed hj-k66 closed 6 months ago
저도 제가 직접 테스트에서 수동 DI를 통해 의존 관계를 변경해 본 기억은 없는 것 같습니다.
다만 서비스 계층 등에서 하위 레이어의 오브젝트를 모킹하는 경우, 설정 파일 수정 없이 임의로 생성한 mock 객체와 의존을 맺어주는 것이니까 크게 보면 말씀하신 경우에 해당한다고 볼 수 있지 않을까? 하는 생각도 들었습니다.
아래와 같이 코드를 작성하면 스프링이 알아서 context에 띄워진 빈 중 UserRepository 으로의 의존을 모킹된 빈으로 대체해주는데
@RunWith(SpringRunner.class)
public class MockBeanAnnotationIntegrationTest {
@MockBean
UserRepository mockRepository;
@Autowired
ApplicationContext context;
@Test
public void givenCountMethodMocked_WhenCountInvoked_ThenMockValueReturned() {
Mockito.when(mockRepository.count()).thenReturn(123L);
UserRepository userRepoFromContext = context.getBean(UserRepository.class);
long userCount = userRepoFromContext.count();
Assert.assertEquals(123L, userCount);
Mockito.verify(mockRepository).count();
}
}
스프링을 사용하지 않고 동일한 상황을 만들기 위해서는 mock 된 객체를 생성자나 수정자를 통해 직접 DI 해서 사용했을 것 같다는 생각이 들었습니다.
Mock 위 예시와 같이 DI 하는 객체에서 테스트 의도대로 결과값이 도출되어야 하는 상황에서 수동 DI를 적용할 수 있을 것 같다!
p198에서 DI를 이용한 테스트 방법을 선택할 때, 예외적인 의존관계를 강제로 구성해야 해서 테스트하는 경우에 @DirtiesContext을 통해 컨텍스트에서 DI 받은 오브젝트에 테스트 코드로 수동 DI 하는 방법을 쓴다고 합니다.
이때 여기서 말하는 예외적인 의존관계를 강제로 구성해야하는 경우가 어떤게 있는지 궁금합니다.