Mockito Test 에서 @(Annotation) 활용하는 방법
@RunWith(MockitoJUnitRunner.class)
public class MockitoAnnotationTest {
...
}
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Mock Annotation
@Test
public void whenNotUseMockAnnotation_thenCorrect() {
List mockList = Mockito.mock(ArrayList.class);
mockList.add("one");
Mockito.verify(mockList).add("one");
assertEquals(0, mockList.size());
Mockito.when(mockList.size()).thenReturn(100);
assertEquals(100, mockList.size());
}
@Mock
List<String> mockedList;
@Test
public void whenUseMockAnnotation_thenMockIsInjected() {
mockedList.add("one");
Mockito.verify(mockedList).add("one");
assertEquals(0, mockedList.size());
Mockito.when(mockedList.size()).thenReturn(100);
assertEquals(100, mockedList.size());
}
@InjectMocks Annotation
쉽게 말하면 테스트 하려는 클래스의 참조변수들을 mock으로 주입(초기화) 해야 하는 경우
테스트 클래스에서 @Mock
애너테이션을 달고 있는 필드들(Mock으로 생성되는 객체들) 을
실제 product 클래스(테스트 클래스에 @InjectMocks 애너테이션을 달고 있는 필드)의 필드에 Mock 객체로 주입해 준다.
Mockito의 InjectMocks..
InjectMocks
은 생성자, 설정자(setter), 필드 순서로 찾아서 주입을 하게 되어 있다.
만약 생성자가 존재하고, 생성자에는 내부에 선언된 필드의 초기화를 수행하지 않는 경우 null 에러 발생 주입은 실패한다.
Mockito javadoc에 InjectMocks이 주입하는 방법에 대해 나와있다.
또 하나의 문제는 만약 성공하던 테스트에 생성자를 새롭게 추가하게 된다면 어느 날 갑자기 테스트는 실패하게 될 것이다.