STUDY/Spring

Mockito | @Mock, @InjectMocks

개미606 2022. 4. 6. 09:56

MockitoExtension

  • JUnit5는 @ExtendWith애노테이션을 사용한다.

해당 애노테이션을 사용하면 @Mock, @Spy, @InjectMocks와 같은 MockitoAnnotations를 사용할 수 있게된다.

@ExtendWith(MockitoExtension.class)
class SomeTestClass {}

@ExtendWidth()로 설정하고 싶지 않다면 직접 해줄 수도 있다..

   public class SampleBaseTestCase {

       private AutoCloseable closeable;

       @Before public void openMocks() {
           closeable = MockitoAnnotations.openMocks(this);
       }

       @After public void releaseMocks() throws Exception {
           closeable.close();
       }
   }

참고로 initMocks()는 Deprecated 상태다. openMocks()를 사용해야 한다.

@Mock

@Mock애노테이션은 모의 클래스를 만들 때 사용한다.

@ExtendWith(MockitoExtension.class)
class SomeTestClass {

    @Mock
    private SomeClass mocking;

}

만약 @Mock애노테이션을 사용하지 않는다면 Mockito.mock()으로 직접 모의 클래스를 설정해 주어야 한다.

public class SomeTestClass {

    private SomeClass mocking;

    @BeforEach {
        this.mocking = Mockito.mock(SomClass.class);
    }

}

@InjectMocks

@InjectMocks는 의존성을 필요로 하는 field에 붙이는 애노테이션으로, @Mock이나 @Spy 애노테이션이 붙은 field를 주입받는다.
이렇게 생성자 방식으로 의존성을 주입받는 클래스가 있다. 해당 클래스를 테스트 할 때 @InjectMocks가 필요하다.

public class SomeService {

    private SomeRepository repository;

    public SomeService(SomeRepository repository) {
        this.repository = repository;
    }
}

이렇게만 하면 의존관계 주입을 자동으로 해준다. 생성자, setter, field 주입 방식을 지원한다.

@ExtendWith(MockitoExtension.class)
class SomeServiceTest {

    @InjectMocks
    private SomeService service;

    @Mock
    private SomeRepository repository;

}