Mockito 객체는 초기화되어야 합니다.

 

@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. :star2:

원문으로 바로가기

Star This Project