아래 글에서 설명하는 Assetions, NsTest에 대한 내용은 우아한테크코스
프리코스 미션에서 제공되는 API입니다.
Assertions
1주 차 숫자야구를 시작하면서 테스트 파일 내부에 NsTest를 확장한 ApplicationTest 가 아래와 같이 예시들이 구현되었습니다.
해당 테스트들이 어떻게 동작하는지 이해하기 위해서 하나씩 살펴보았습니다.
assertRandomNumberInRangeTest
우선 첫 번째 테스트에서 사용된 메서드를 살펴보았습니다.
해당 메서드는 파라미터들을 받아서 내부에서 assertRandomTest를
실행하고 있습니다.
그렇다면 assertRandomTest
가 뭔지 살펴보았습니다.
assertRandomTest
이 메서드는 내부에서 assertTimeoutPreemptively
를 사용하고 있었습니다.
assertTimeOutPreemptively
이 메서드를 살펴보니 이는 Assertions에 정의된 메서드로 주어진 시간 내에 콜백으로 넘겨지는 작업을 처리하는지 확인하는 메서드였습니다.
실제로 assertRandomTest
에서 RANDOM_TEST_TIMEOUT
으로 10초라는 시간이 넘겨졌습니다.
즉 10초 동안 콜백으로 넘겨지는 작업을 처리할 수 있는지 확인하는 테스트를 의미합니다.
그렇다면 이제 콜백이 어떤 작업을 하는지 살펴보겠습니다.
MockedStatic이라는 것이 사용되는데 검색을 해보니 이는 static 메서드를 테스트할 때 사용된다고 합니다. 위에서 확인해 보면 콜백으로 넘겨지는 Randoms.pickNumberInRange
가 static 메서드인데 이를 테스트하기 위해서 MockedStatic을 사용한 것 같습니다.
mockStatic(Randoms.class)
와 같이 클래스가 건네어지는데 해당 클래스를 확인해 보면
위와 같이 static 메서드들이 정의되어 있는 것을 볼 수 있었습니다.
그리고 이어서 thenReturn
을 살펴보면 when
에 건네진 메서드가 실행되었을 때 리턴될 값을 정의해 주는 것을 확인할 수 있고 values
로 넘겨지는 값들을 순서대로 리턴한다고 합니다.
처음 봤을 때는 이게 무슨 말인가 했는데 계속 살펴보면서 답이 나왔습니다.
when
에 건네진 메서드를 맨 처음 실행하면 value
에 해당하는 값이 나오고 그 뒤에 또 실행했을 때는 values
에 정의된 값이 순서대로 나온다는 것을 의미합니다.
이게 무슨 말이야? 하실 겁니다. 다음을 살펴보겠습니다!
테스트를 확인해 보면 value
로 1, values
로 3, 5, 5, 8, 9 가 건네어지는데 이는 순서대로 Randoms.pickNumberInRange
(when
에 건네진 메서드)를 실행했을 때 리턴되는 값을 지정한 것입니다.
즉, 게임이 시작되고 컴퓨터의 정답 숫자를 초기화할 때 pickNumberInRange
를 3번 실행하는데 이때 랜덤으로 숫자가 나오는 것이 아니라 순서대로 1, 3, 5 가 숫자가 나온다는 것을 의미합니다. 그렇게 되면 정답 숫자는 "135"가 됩니다.
그리고 게임을 재시작했을 때 다시 pickNumberInRange
를 3번 실행하는데, 이때는 순서대로 5, 8, 9 가 나오면서 정답 숫자는 "589"가 된다는 것을 의미합니다!
다시 assertRandomTest
를 살펴보면서 확인해 보면서 정리하자면 위 코드는
“Randoms.class
에 정의된 static 메서드들을 사용하여 테스트를 진행할 건데, 해당 클래스에 정의된 Randoms.pickNumberInRange
메서드 (verification)가 오면 value와 values를 차례대로 리턴해줘.”
라는 것을 의미합니다!
assertSimpleTest
이 메서드는 앞서 살펴보았던 asserTimeoutPReemptively
를 사용하는 테스트로 1초 내에 콜백으로 넘겨지는 작업이 수행되는지 확인하는 테스트입니다.
NsTest
run
콜백 함수에서 run
이라는 메서드 사용하였는데 이 메서드가 무슨 역할을 하는지 찾아보았습니다.
이 메서드는 NsTest에 정의된 메서드로 위와 같이 되어 있었습니다.
command
args 로 받은 문자열을 개행(\n)으로 붙이고 바이트 배열로 바꿔 입력 스트림으로 보내는 역할을 합니다.
여기서는 "246\n135\n1\n..."
와 같은 문자열을 바이트 배열로 바꿔서 입력 스트림에 보낼 것입니다.
runMain
run
메서드에서는 command()
실행 후, runMain()
를 실행합니다.
그래서 runMain()
를 찾아보았는데 NsTest 클래스에서는 추상함수로 정의되어 있습니다. 따라서 이를 상속받은 ApplicationTest에 해당 함수를 구현해야 합니다.
ApplicationTest에서는 위와 같이 정의되어 있는데 단순히 Application.main
함수(애플리케이션 실행 함수)를 빈 문자열 배열과 함께 넘겨주어서 실행합니다.
위에서 args
를 사용하지 않으니까 runMain
에서 빈 문자열을 넘겨준 것 같습니다.
runExcpetion
예외 테스트에서 runExcpetion
이라는 메서드를 사용하는데 이에 대해서도 살펴보았습니다.
run
을 호출하는데 NoSuchElementException
예외만 잡는 메서드였습니다.
그 외의 예외는 그대로 터트리도록 하여 외부에서 assertThatThrownBy
로 확인하도록 의도된 것 같습니다.
🌐 Reference
Mockito를 이용하여 static method 유닛 테스트
'개발 스토리' 카테고리의 다른 글
getter 를 지양해야하는 이유 (1) | 2023.10.28 |
---|---|
JUnit에 대해 알아보고 사용해보기 👀 (1) | 2023.10.27 |
컬렉션 프레임워크(Collection Framework) 은 뭐지?? (1) | 2023.10.23 |
자바 스트림(Stream)이란 무엇이고 왜 쓰는건가? (0) | 2023.10.22 |
MVC 패턴에 대해, 그리고 이를 지키는 규칙 (2) | 2023.10.21 |