우아한 테크코스 미션을 진행하던 도중, 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

+ Recent posts