티스토리 뷰
아래 글에서 설명하는 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 유닛 테스트
Mockito를 이용하여 static method 유닛 테스트
아래와 같이 간단한 클래스가 있다고 가정해보자. package com.example.mockedstaticunittest; public class Calculator { public static int add(int x, int y) { return x + y; } public int sub(int x, int y) { return x - y; } } 해당 코드의 s
www.crocus.co.kr
'개발 스토리' 카테고리의 다른 글
| 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 |
- Total
- Today
- Yesterday
- 토스 합격 후기
- 우테코 준비
- 분산락
- 우아한테크코스 후기
- 코루틴
- 토스 2025 NEXT
- 커넥션 데드락
- 토스 백앤드 합격
- 파이썬
- 게임개발
- 토큰
- 우테코
- JWT
- redis
- 레디스
- 토스 NEXT 후기
- Cache Stampede
- 자바
- 우아한테크코스
- 우아한테크코스 자소서
- 토스 next 2025
- Assertions
- API 지연
- 캐시 스템피드
- 우테코 6기
- 우아한테크코스 6기
- 우테코 프리코스
- 6기
- 알고리즘
- stoplight
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |