개발
home
🧙

mockito-kotlin 사용 기록. capture, eq

Created
2022/07/24
Tags
Kotlin
TestCode
mock
2022-07-24 @이영훈
mockito-kotlin를 사용해서 captor와 eq을 사용한 것을 기록으로 남깁니다.
helper method(관련 내용)를 만들어서 capture를 할수도 있지만 코드가 우아하지 않고 매번 helper method를 정의하는 것이 유지관리하는 측면에서도 안 좋다고 생각이 들어 mockito-kotlin 라이브러리를 도입했습니다.

mockito-kotlin 라이브러리 역할

mockito 라이브러리를 kotlin에서 사용할 때 null이 반환되면 Null Point Exception(NPE)이 터져서 null이 반환되지 않도록하거나 null이 반환되었을 때 처리해야 합니다.
mockito-kotlin의 eq 함수를 보면 다음과 같이 null을 반환하지 않도록 내부에서 처리해줍니다.
fun<T> eq(value: T): T { return ArgumentMatchers.eq(value) ?: value }
Kotlin
복사
이런 식으로 mockito-kotlin 라이브러리는 코틀린에서 Mockito가 null 타입이 반환되었을 때 처리해줌으로써 nullable 타입이 반환되지 않도록 도와주는 helper mehtod들이 정의되어 있습니다.

mockito-kotlin의 Captor, eq 사용 예시

헬퍼 메소드로 작성한 글과 동일한 예시를 mockito-kotlin을 사용해서 변경해보겠습니다.
다음과 같은 MessageBroker class가 있다고 했을 때 message의 값을 capture해서 비교하는 테스트 코드를 작성합니다.
@Component class MessageBroker() { fun publish(topic: String, message: MessageDTO) { // code... } } class MessageDTO( val id: String, val content: String, )
Kotlin
복사
import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import org.mockito.Mock import org.mockito.junit.jupiter.MockitoExtension import org.mockito.kotlin.argumentCaptor // ⭐️ mockito-kotlin import org.mockito.kotlin.eq // ⭐️ mockito-kotlin import org.mockito.kotlin.verify @ExtendWith(MockitoExtension::class) internal class MessageBrokerTest { @Mock private lateinit var messageBroker: MessageBroker @Test fun `test publish`() { // given val topic = "some-topic" val message = MessageDTO(id = "message-id", content = "hello world") // when messageBroker.publish(topic, message) // then val messageCaptor = argumentCaptor<MessageDTO>() verify(messageBroker).publish(eq("some-topic"), messageCaptor.capture()) assertThat(messageCaptor.firstValue.id).isEqualTo("message-id") assertThat(messageCaptor.firstValue.content).isEqualTo("hello world") // 다음과 같이 Recursive 비교를 통해 객체 자체를 비교할 수도 있습니다. assertThat(messageCaptor.firstValue) .usingRecursiveComparison() .isEqualTo(MessageDTO(id = "message-id", content = "hello world")) } }
Kotlin
복사