emiling / TIL

RAM → SSD
1 stars 0 forks source link

Kotlin에서 Mockito 사용하여 테스트 할 때 유의할 점 #8

Open emiling opened 2 years ago

emiling commented 2 years ago

Kotlin에서 Mockito 사용하여 테스트 할 때 유의할 점

data class Bucket(
    val id: Long = 0,
    val name: String = "",
    val url: String? = null
)

class BucketService {
    fun execute(bucket: Bucket) { ... }
}
class BucketTest {
    private lateinit var service: BucketService
    // ...
    @Test
    fun `버킷이 정상적으로 들어왔을 때 execute 함수를 테스트한다`() {
        // given & when 
        ...
        // then
        val captor = ArgumentCaptor.forClass(Bucket::class.java)
        verify(service, times(1)).execute(captor.capture())
        ...
    }
}
java.lang.NullPointerException: captor.capture() must not be null
  at com.example.bucket.service.BucketTest.버킷이 정상적으로 들어왔을 때 execute 함수를 테스트한다 (BucketTest.kt:39)
  at java.util.ArrayList.forEach(ArrayList.java:1259)
  at java.util.ArrayList.forEach(ArrayList.java:1259)
emiling commented 2 years ago

Decompile Kotlin Code

같은 코드를 JAVA로 작성하면 문제가 없는데 Kotlin 코드 상에서 문제가 되는 것이 이상해서 테스트 코드 부분을 Kotlin Decompile 했더니 다음과 같았다.

      ArgumentCaptor var5 = ArgumentCaptor.forClass(Bucket.class);
      Intrinsics.checkNotNullExpressionValue(var5, "ArgumentCaptor.forClass(…Bucket::class.java)");
      ArgumentCaptor captor = var5;
      BucketService var6 = this.service;
      if (var6 == null) {
         Intrinsics.throwUninitializedPropertyAccessException("executor");
      }

      var6 = (BucketService)Mockito.verify(var6, Mockito.times(1));
      Object var10001 = captor.capture();
      Intrinsics.checkNotNullExpressionValue(var10001, "captor.capture()"); // 여기서 NPE발생
      var6.execute((Bucket)var10001);

Solution

mockito-kotlin 사용

DIY

참고 : Mockito - Kotlin test throws Null Pointer Exception when trying to capture Pageable argument