자바/초록스터디

(7)초록스터디 로또 1,2 단계 테스트 코드 구현

문상휘파람 2024. 5. 23. 20:29

 이 글에서는 앞에 소개한 메서드에 대한 테스트 코드만 설명할 예정이다.

테스트 코드

 

위에 사진과 같은 형식으로 나누어 테스트를 구현하였고, 이에 대해 소개하고자 한다.


*FakeLottoNumberGenerator

package FakeRandomNumber;

import domain.CreateLottoNumber;

import java.util.List;

public class FakeLottoNumberGenerator implements CreateLottoNumber {

    @Override
    public List<Integer> getRandomLottoNumber() {
        return List.of(1,2,3,4,5,6);
    }
}

 

앞 글에서 설명한 인터페이스를 상속받아 랜덤 로또 넘버가 잘 생성되는지 검증하기 위해 만든 클래스이다.


*LottoNumberGeneratorTest

package domain;

import FakeRandomNumber.FakeLottoNumberGenerator;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

class LottoNumberGeneratorTest {

    @Test
    @DisplayName("로또 숫자 생성 인터페이스 테스트")
    void getRandomLottoNumber() {
        //given
        final FakeLottoNumberGenerator fakeLottoNumberGenerator = new FakeLottoNumberGenerator();
        final List<Integer> expected = fakeLottoNumberGenerator.getRandomLottoNumber();

        //when
        final List<Integer> actual = List.of(1, 2, 3, 4, 5, 6);

        //then
        assertEquals(expected, actual);
    }
}

 

이게 코드가 바로 위 Fake클래스를 상속받아 로또 넘버가 잘 생성되는지 확인하는 테스트 코드이다.


*LottosTest

package domain;

import FakeRandomNumber.FakeLottoNumberGenerator;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Random;

import static org.junit.jupiter.api.Assertions.*;

class LottosTest {
    @Test
    @DisplayName("로또 묶음 사이즈 테스트")
    void getLottos() {
        //given
        final Random randomNumberGenerator = new Random();
        final int lottoMoney = 3000;
        final CreateLottoNumber createLottoNumber = new LottoNumberGenerator(randomNumberGenerator);
        final Lottos lottos = new Lottos(lottoMoney, createLottoNumber);
        final int expected = 3;

        //when
        final int actual = lottos.getLottos().size();

        //then
        assertEquals(expected, actual);
    }
}

*LastWeekLottoNumberTest

package domain;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

class LastWeekLottoNumberTest {

    @Test
    @DisplayName("지난 주 로또 당첨 번호 입력 테스트")
    void getLastWeekLottoNumber() {
        //given
        final String inputLastWeekNumber = "1,2,3,4,5,6";
        final LastWeekLottoNumber lastWeekLottoNumber = new LastWeekLottoNumber(inputLastWeekNumber);
        final List<Integer> expected = lastWeekLottoNumber.getLastWeekLottoNumber();

        //when
        final List<Integer> actual = List.of(1, 2, 3, 4, 5, 6);

        //then
        assertEquals(expected, actual);
    }
}

*LottoRankTest

package domain;

import FakeRandomNumber.FakeLottoNumberGenerator;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

class LottoRankTest {

    @Test
    @DisplayName("지난 수 로또 번호와 맞은 개수 테스트")
    void getSameLottoNumber() {
        //given
        final String inputLastWeekNumber = "1,2,3,4,5,6";
        final LastWeekLottoNumber lastWeekLottoNumber = new LastWeekLottoNumber(inputLastWeekNumber);
        final CreateLottoNumber createLottoNumber = new FakeLottoNumberGenerator();
        final Lotto lotto = new Lotto(createLottoNumber);
        final List<Integer> lastWeeklottoNumber = lastWeekLottoNumber.getLastWeekLottoNumber();
        final LottoRank lottoRank = new LottoRank(lotto, lastWeeklottoNumber);
        final int expected = lottoRank.getSameLottoNumber();

        //when
        final int actual = 6;

        //then
        assertEquals(expected, actual);
    }
}

*LottosRankTest

package domain;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Random;

import static org.junit.jupiter.api.Assertions.*;

class LottosRankTest {

    @Test
    @DisplayName("로또 등수 사이즈 파악 테스트")
    void getRankLottos() {
        //given
        final Random randomNumberGenerator = new Random();
        final int lottoMoney = 3000;
        final CreateLottoNumber createLottoNumber = new LottoNumberGenerator(randomNumberGenerator);
        final Lottos lottos = new Lottos(lottoMoney, createLottoNumber);
        final String inputLastWeekNumber = "1,2,3,4,5,6";
        final LastWeekLottoNumber lastWeekLottoNumber = new LastWeekLottoNumber(inputLastWeekNumber);
        final LottosRank lottosRank = new LottosRank(lottos, lastWeekLottoNumber.getLastWeekLottoNumber());
        final List<Integer> expected = List.of(1, 1, 1, 1);

        //when
        final int actual = lottosRank.getRankLottos().size();

        //then
        assertEquals(expected.size(), actual);
    }
}

*LottoReturnRateTest

package domain;

import FakeRandomNumber.FakeLottoNumberGenerator;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

class LottoReturnRateTest {

    @Test
    @DisplayName("로또 당첨금 테스트")
    void makeLottoPrice() {
        //given
        final List<Integer> lottoRank = List.of(1, 2, 3, 4);
        final int getLottoMoney = 3000;
        final LottoReturnRate lottoReturnRate = new LottoReturnRate(lottoRank, getLottoMoney);
        final List<Integer> expected = List.of(5000, 50000, 1500000, 2000000000);

        //when
        final List<Integer> actual = lottoReturnRate.makeLottoPrice();

        //then
        assertEquals(expected, actual);
    }

    @Test
    @DisplayName("수익률 계산 테스트")
    void calculateLottoReturnRate() {
        //given
        final List<Integer> lottoRank = List.of(1, 0, 0, 0);
        final int getLottoMoney = 3000;
        final LottoReturnRate lottoReturnRate = new LottoReturnRate(lottoRank, getLottoMoney);
        final double expected = 1.66;

        //when
        final double actual = lottoReturnRate.calculateLottoReturnRate();

        //then
        assertEquals(expected, actual);
    }
}

 

 


정리.

 

 뭔가 이렇게 정리하고 나니까 테스트가 빈약한 느낌을 지울 수가 없다.............다들 저처럼은 테스트 코드 작성하지 마시길. 그래도 이번엔 메서드 구현하고 바로 바로 테스트 하긴 했는데 ....아무리 생각해도 이건 TDD가 아닌 것 같다. 

로또 번호 범위 검증이라던지 이런 경우를 더 생각해서 넣었어야 한다는 생각이 자꾸 든다. 근데 이미 PR 땡겨서 다음 단계부터 제대로 테스트 코드 짜봐야겠다. 테스트는 어려워~~..