spyk는 뭔 일을 하나요

spyk(WebClient.builder()...build())

 

  • 기본 동작은 진짜 WebClient 그대로 실행
  • 하지만 특정 메서드만 가로채서(stub / verify) 조작 가능

spyk는 partial mock이라고 하는데(부분 목)

  • 실제 객체를 사용하되
  • 내가 지정한 메서드만 가짜로 바꾼다는 것

 

이런 코드가 있다고 하자.

val webClientSpy =
    spyk( // spyk가 래핑한다
        WebClient.builder() // webclient 인스턴스를
            .baseUrl(mockWebServer.url("/").toString())
            .clientConnector(ReactorClientHttpConnector(httpClient))
            .build()
    )

 

이 때 실제로 벌어지는 일들은

  • 실제로 WebClient 인스턴스를 생성한다.
  • 그 인스턴스를 spyk가 감싼다(래핑)

 

이 뒤에 별다른 코드를 하지 않고 get()을 호출하면

webClientSpy.get()

실제로 WebClient.get()이 호출된다.

진짜 네트워크가 동작함.

 

그런데? 특정 메서드만 stub한다면

every {
    webClientSpy.get()
} returns mockRequest

get()은 내가 작성한 mock을 동작시킨다.

그 외 메서드는 실제로 작동한다.

 

 

when use?

  • webClient의 특정 단계만 제어하고 싶을 때 (예: retrieve(), exchangeToMono())
  • 호출 여부를 검증하고 싶을 때 ( verify )