개요

  • mockk 의 wasNot Called 를 쓰는 방법
  • java.lang.AssertionError: Verification failed 관련 에러
  • 최근에 mockk 의 verify { } 코드블럭에서 wasNot called 를 잘못쓰고 있었다.

 

코드영역

아래와 같이 NumberService, NumberEvenService, NumberOddService 가 있다고 가정한다. 

넘어오는 number 값에 따라서 분기처리 되어 특정 클래스의 메소드를 수행하고 있다.

// NumberService
@Service
class NumberService(
    private val numberEvenService: NumberEvenService,
    private val numberOddService: NumberOddService
) {

    fun process(number: Long) {

        if (number % 2 == 0L) {
            numberEvenService.doSomething(number)
            return
        }

        numberOddService.doSomething(number)
    }
}

// 짝수 서비스
@Service
class NumberEvenService {

    companion object: KLogging()

    fun doSomething(number: Long) {
        logger.info { "짝수 : $number" }
    }
}

// 홀수 서비스
@Service
class NumberOddService {

    companion object: KLogging()

    fun doSomething(number: Long) {
        logger.info { "홀수 : $number" }
    }
}

 

위의 코드에 대해서 테스트코드를 작성하면, 아래와 같이 작성할 수 있다.

@TestInstance(TestInstance.Lifecycle.PER_METHOD)
internal class NumberServiceTest {

    private val numberOddService: NumberOddService = mockk(relaxUnitFun = true)
    private val numberEvenService: NumberEvenService = mockk(relaxUnitFun = true)
    private val numberService = NumberService(numberEvenService, numberOddService)

    @Test
    @DisplayName("number 가 홀수라서, NumberOddService 가 호출된다.")
    fun oddServiceCallTest() {

        // given
        val number = 3L

        // when
        numberService.process(number)

        // then
        verify {
            numberOddService.doSomething(any())
            numberEvenService wasNot called
        }
    }

    @Test
    @DisplayName("number 가 짝수라서, numberEvenService 가 호출된다.")
    fun evenServiceCallTest() {

        // given
        val number = 2L

        // when
        numberService.process(number)

        // then
        verify {
            numberEvenService.doSomething(any())
            numberOddService wasNot called
        }
    }
}

 

wasNot called 는 mock 대상으로 호출되어야 한다. (stub 이 대상이 되면 안된다.!)

wasNot called 는 mock 대상 자체가 아예 호출이 안되었음을 표현하기 때문에 아래와 같이 하면 에러를 만난다.

verify {
    // 이렇게 작성하면 에러를 만난다.!!
    numberEvenService.doSomething(any()) wasNot called
}

 

그러면 우리는 메소드가 호출되었는지 여부를 어떻게 알 수 있는가? verify 람다에다 별도로 추가인자 exactly 값을 별도로 전달해줘야한다.

// number 값이 홀수인경우
verify {
    numberOddService.doSomething(any())
    numberEvenService wasNot called
}
verify(exactly = 0) {
	// 0번 실행했음을 의미
    numberEvenService.doSomething(any())
}

// number 값이 짝수인경우
verify {
    numberEvenService.doSomething(any())
    numberOddService wasNot called
}
verify(exactly = 0) {
	// 0번 실행했음을 의미
    numberOddService.doSomething(any())
}

 

참고자료

Posted by doubler
,