Language/Java(TestCode)

[TestCode] Mock 객체 만들기 Mockito (JUnit5)

비독개 2022. 9. 4. 11:42

- 사용이유 : 테스트 코드에서 객체 생성시 Mokito를 활용하여 임의로 생성해주어 번거로움을 줄일 수 있다.

 

Mockito.mock() 메소드를 활용하여 만드는 법

@Test
    void createLunchService() { // mock() 메소드로 만드는 방법
        LunchRepository lunchRepository = mock(LunchRepository.class);
        LunchService lunchService = new LunchService(lunchRepository);
        assertNotNull(lunchService);
    }

- Mockito가 없다면 위 객체를 만들어주는데 필요한 구현체를 모두 구현해 줘야하기때문에 장황한 코드가 발생하지만 Mockito를 활용하여 위처럼 짧고 간결하게 구성할 수 있다.

 

@Mock 애노테이션을 활용하여 만드는 법

    @Mock
    LunchRepository lunchRepository;

    @Test
    void createLunchService() {
        LunchService lunchService = new LunchService(lunchRepository);
        assertNotNull(lunchService);
    }

-  위처럼 선언해주면된다. 하지만, 위 코드는 에러가 발생할 것이다.

- 그 이유는 해당 클래스에 익스텐션을 추가해줘야 하기 때문이다.

@ExtendWith(MockitoExtension.class)
class LunchServiceTest {
```
}

- 하지만(?) 나의 경우엔 익스텐션을 추가해주고도 에러가 발생하는걸 확인했다.

- 그이유는 stackoverflow를 통해 확인해보니 버전의 문제였다..ㅎ

- gradle 에서 mockito-core의 버전을 2.1.0으로 설정해 두었는데 버전을 3.7.0으로 올려 해결하였다.

testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.7.0'

- 수정 후에는 정상 동작하였다.

 

파라미터로 받아서 사용하는 방법

    @Test
    void createLunchService3(@Mock LunchRepository lunchRepository) {
        LunchService lunchService = new LunchService(lunchRepository);
        assertNotNull(lunchService);
    }

- 위처럼 활용이 가능하여 각 테스트 코드마다 객체를 따로 사용할 수 있다.