이 글에서는 앞에 소개한 메서드에 대한 테스트 코드만 설명할 예정이다.
위에 사진과 같은 형식으로 나누어 테스트를 구현하였고, 이에 대해 소개하고자 한다.
*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 땡겨서 다음 단계부터 제대로 테스트 코드 짜봐야겠다. 테스트는 어려워~~..
'자바 > 초록스터디' 카테고리의 다른 글
(9)초록스터디 로또 3,4 단계 최종 구현 (0) | 2024.07.15 |
---|---|
(8)초록스터디 로또 3,4 단계 구현 (0) | 2024.07.15 |
(6)초록스터디 로또 1,2 단계 구현 (0) | 2024.05.23 |
(5)초록스터디 : 계산기 구현 PR 후기 (0) | 2024.05.22 |
(4)초록스터디 step1 : 문자열 계산기 구현과 JUnit5 테스트 (0) | 2024.05.09 |