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
복사

