SSAFY11th-book-study / book-study

SSAFY 11기 6반의 '토비의 스프링 스터디'
0 stars 0 forks source link

[2.4.2] 테스트를 위한 수동 DI를 적용하는 경우 #16

Closed hj-k66 closed 6 months ago

hj-k66 commented 6 months ago

p198에서 DI를 이용한 테스트 방법을 선택할 때, 예외적인 의존관계를 강제로 구성해야 해서 테스트하는 경우에 @DirtiesContext을 통해 컨텍스트에서 DI 받은 오브젝트에 테스트 코드로 수동 DI 하는 방법을 쓴다고 합니다.

이때 여기서 말하는 예외적인 의존관계를 강제로 구성해야하는 경우가 어떤게 있는지 궁금합니다.

gmelon commented 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 해서 사용했을 것 같다는 생각이 들었습니다.

코드 출처

hj-k66 commented 6 months ago

Mock 위 예시와 같이 DI 하는 객체에서 테스트 의도대로 결과값이 도출되어야 하는 상황에서 수동 DI를 적용할 수 있을 것 같다!