⚡ 생각대로 살지 않으면 사는대로 생각한다.
⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.
만약 Service 인스턴스를 Test 코드에서 생성한다고 가정했을 때, 보통 서비스에서는 Repository 인터페이스나 기타 인터페이스를 주입받게 되어있다. 그런데 테스트 코드에서는 이런 것들을 주입받을 수가 없다.
이런 상황이 Mock을 사용하기 가장 적절한 경우다.
즉, 작성하고있는 코드가 잘 동작하는지 확인하려고 할 때,
주입받고 있는 클래스나 인터페이스들을 Mocking해서 테스트 할 수 된다.
MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class);
위의 코드와 같이 mock을 만들 수 있다.
(mock메서드는org.mockito.Mockito.mock
을 static import 한다.)
💡 위의 부분을 더 간결하게 할 수 있는 방법이 있는데,
@Mock애너테이션을 사용하면 된다.
다만, @Mock을 붙인다고해도assertNotNull
에서는 테스트 실패가 나온다. 이유는 아래와 같다.※ @Mock 애너테이션을 붙인다고 해도 무슨 일이 일어나진 않는다. @Mock 애너테이션을 만든다고 해도 null이기 때문이다.. 따라서 @Mock 애너테이션을 처리해줄 Extendtion을 등록해야한다.
@ExtendWith(MockitoExtension.class)
을 Test 클래스 위에 선언하면, @Mock 애너테이션이 붙은 클래스나 인터페이스의 Mock객체를 만들어준다.
@Mock 애너테이션은
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Mock MemberService memberService;
@Mock StudyRepository studyRepository;
이런식으로 필드에 사용할 수도 있고,
@ExtendWith(MockitoExtension.class)
class StudyServiceTest {
@Test
void createStudyService(@Mock MemberService memberService,
@Mock StudyRepository studyRepository) {
StudyService studyService = new StudyService(memberService, studyRepository);
assertNotNull(studyService);
}
}
위의 코드와 같이 생성자의 매개변수로 Mock객체를 만들어 줄 수도 있다.
아쉬운 것... 소스코드를 깃허브에서 봤는데도, 안 맞는 부분이 있고, 강의에서 나오는대로 보려고해도 안 나와서 그냥 설명하는대로 블로깅중이다..
-끝-