개요
- 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())
}
참고자료
'open source' 카테고리의 다른 글
2023-01-07 : [mockk] captured 사용 (0) | 2023.01.07 |
---|---|
2022-11-01 [mysql] : Locking Reads 읽기 (S-LOCK & X-LOCK) (0) | 2022.11.01 |
2022-08-20 [redis] : redis-cli 시 hex 를 순수 string 으로 보고자 할 때. (0) | 2022.08.20 |
2021-12-30 [jmeter] jmeter 성능 테스트 수행 (2) (0) | 2021.12.30 |
2021-12-19 [jmeter] jmeter 설치 및 실행 (1) (0) | 2021.12.19 |