@Mock, @Spy, @Captor, @InjectMocks와 같은 Mockito 어노테이션이 달린 객체는 명확하게 초기화될 필요가 있습니다.
이 작업에는 여러가지 방법이 있습니다:
- 셋업 함수 안에 MockitoAnnotations.openMocks(this), MockitoAnnotations.initMocks(this) 함수를 호출하세요.
- 테스트 클래스에 @RunWith(MockitoJUnitRunner.class) 어노테이션을 추가하세요. (JUnit 4)
- 테스트 클래스에 @ExtendWith(MockitoExtension.class) 어노테이션을 추가하세요. (JUnit 5 Jupiter)
- @Rule public MockitoRule rule = MockitoJUnit.rule(); 를 이용하세요.
초기화된 mock 없는 테스트는 실패합니다. Mockito 객체에 대해서만 적용됩니다. Mockito.mock(), Mockito.spy()를 통해 인스턴스화 된 객체를 초기화하는 것은 불필요합니다. 이 규칙은 초기화되지 않은 mock을 테스트 클래스에서 사용하는 경우 문제를 제기합니다.
규칙을 어긴 코드
public class FooTest { // 규칙을 어긴 코드: Mockito 초기화가 없습니다.
@Mock
private Bar bar;
@Spy
private Baz baz;
@InjectMocks
private Foo fooUnderTest;
@Test
void someTest() {
// 테스트
}
@Nested
public class Nested {
@Mock
private Bar bar;
}
}
규칙을 준수한 코드
@RunWith(MockitoJUnitRunner.class)
public class FooTest {
@Mock private Bar bar;
// ...
}
@ExtendWith(MockitoExtension.class)
public class FooTest {
@Mock private Bar bar;
// ...
}
public class FooTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock private Bar bar;
// ...
}
public class FooTest {
@Mock private Bar bar;
// ...
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
// ...
}
public class FooTest {
@Mock private Bar bar;
// ...
@Before
void setUp() {
MockitoAnnotations.initMocks(this);
}
// ...
}
@ExtendWith(MockitoExtension.class)
public class FooTest {
@Nested
public class Nested {
@Mock
private Bar bar;
}
}
참고
If you like SONARKUBE, don’t forget to give me a star.