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