본문 바로가기

개발일지

[Junit5] Static Method Mocking

Junit5 Static Method Mocking

회원가입을 진행하는데 있어 가입 인증 메일을 통해 검증을 진행했다.

이메일을 사용하는 곳은 단순 가입 인증 메일만이 아니다.

비밀번호 변경을 진행하는데 있어서도 비밀번호 변경 메일을 통해 검증을 진행하고 비밀번호 변경을 진행할 수 있도록 구현했다.

이메일은 JavaMailSender를 통해 보내도록하였고 Html 전송을 위해 MimeMessage를 생성하여 이를 처리할 수 있도록 하였다.

(이메일 전송에 관해 자세하게 다루는 포스트가 아니므로 생략하겠습니다.)

이에 대한 로직을 실제로 테스트해보기 위해 작성해둔 Unit 테스트를 돌려보았는데 제대로된 Mocking이 되지 않고 Null Object로 남아있는 모습을 확인할 수 있었다.

이메일의 내용에 Html이 담기지 않는다고 이메일 전송이라는 큰 틀의 테스트에서 실패하는 모습을 보이지는 않지만 추후 Static Method Mocking에 대한 부분이 필요할 것 같아 이에 대해 자세히 알아보려고 했다.

나는 테스트를 위해 Junit5를 사용 중이였고 이를 해결해보려고 했다.

Static Method를 Mocking하기 위해서는 추가적인 의존성이 필요했다.

먼저, 다음 의존성을 추가한다.

testImplementation group: 'org.mockito', name: 'mockito-inline', version: '3.7.7'

그리고 사용할 Static Method를 Mocking해야하는데 그 전에 해당 Static Method를 가진 클래스에 대해 MockStatic 객체에 선언해줘야한다.

MockedStatic<HtmlFactory> htmlFactoryMockedStatic;

@BeforeEach
public void init() {
    htmlFactoryMockedStatic = mockStatic(HtmlFactory.class);
}

@AfterEach
public void end() {
    htmlFactoryMockedStatic.close();
}

여기서 각각의 테스트가 시작할 때, 해당 팩토리 클래스를 주입시켜주어 Mocking할 수 있게하고 테스트가 종료될 때 닫도록 하였다.

한 스레드에서 Static Mocking 등록은 한 번 밖에 못하기에 테스트가 종료될 때 같이 종료시켜주지 않는다면 해당 Exception을 받게 된다.

org.mockito.exceptions.base.MockitoException: 
For utils.Randoms, static mocking is already registered in the current thread

To create a new mock, the existing static mock registration must be deregistered

그리고 실제 Mocking을 진행할 때는 일반적으로 사용할 때와 같다.

given(HtmlFactory.getHtml(any())).willReturn("html");

위와 같이 메소드명과 파라미터를 입력해주고 리턴 값을 입력해주면 된다.