우아한 테크코스 미션을 진행하던 도중, TDD로 개발을 하는데 랜덤 데이터를 테스트해야 하는 경우가 생겼다. 이 때, 랜덤 데이터를 뽑는걸 어떻게 테스트해야 할까 고민하다가 좀 검색하고 찾아보니 랜덤 데이터를 사용하는 클래스의 생성자에 랜덤 데이터를 뽑는 인터페이스를 받도록 구현하고 테스트 클래스에서는 구현 객체를 특정 정수를 리턴하도록 구현하였다. 그 결과 어느정도 만족스럽게 된 것 같다.
RandomUtil 인터페이스 생성
우선, 랜덤값을 발생시키는 generate 메소드를 가지는 RandomUtil 인터페이스를 만들어 둔다.
public interface RandomUtil {
public int generate();
}
클래스 생성자에 RandomUtil 받도록 구현
Example 클래스에서 RandomUtil의 구현 객체에 의존하도록 생성자에 RandomUtil을 추가해 준다.
public class Example {
RandomUtil randomUtil;
public Example(RandomUtil randomUtil) {
this.randomUtil = randomUtil;
}
public int generate() {
return randomUtil.generate();
}
}
테스트 케이스 작성
위와 같이 생성자에서 RandomUtil을 추가해 주면, 넘겨준 RandomUtil을 조정해주는 방식을 통해 원하는대로 테스트를 진행할 수 있다. 따라서, Random의 결과를 조정해 줄 수 있으므로, 각각의 결과에 따라 테스트 케이스를 작성하는 방식으로 진행하였다.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.Random;
import static org.junit.jupiter.api.Assertions.*;
class ExampleTest {
@Test
@DisplayName("generate의 결과로 1이 나옴")
void generate_1() {
Example example = new Example(() -> 1);
assertEquals(example.generate(), 1);
}
@Test
@DisplayName("generate의 결과로 5가 나옴")
void generate_5() {
Example example = new Example(() -> 5);
assertEquals(example.generate(), 5);
}
@Test
@DisplayName("generate의 결과로 난수가 나옴")
void generate_Random() {
Example example = new Example(() -> {
Random random = new Random();
return random.nextInt(100);
});
int randomData = example.generate();
assertTrue(0 <= randomData && randomData < 100);
}
}
'Language > Java' 카테고리의 다른 글
JVM의 동작원리 (0) | 2022.10.22 |
---|---|
lambda 예외 핸들링 (0) | 2022.10.02 |
[ Junit ] 테스트 작성 (0) | 2022.02.10 |
[ Java ] 쉽게 최대공약수 구하기 (0) | 2022.02.03 |
[ Java ] 문자열 알파벳순 정렬하기 (0) | 2022.01.12 |