조종 다음은 개발
article thumbnail

아래 글에서 설명하는 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 메서드들이 정의되어 있는 것을 볼 수 있었습니다.

assertRandomTest 에서 assertTimeoutPreemptively 로 넘기는 콜백 함수에 thenReturn 이라는 메서드를 사용했습니다.

그리고 이어서 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 에서 정의된 runMain

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

 

https://github.com/Seongwon97/woowa_precourse_record/blob/main/Week1%20(21.11.24~30)/Test%EC%BD%94%EB%93%9C%EC%97%90%20%EC%9E%88%EB%8A%94%20NsTest%20%26%20Assertion%20%EB%B6%84%EC%84%9D.md

profile

조종 다음은 개발

@타칸

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!