사이드프로젝트/(240808)이거왜오름?
이거왜오름? 테스트 작성
rkrkrr0101
2024. 9. 12. 20:01
사실 이전부터 테스트는 계속 작성하고있었음
꼭 테스트를 만들기위해서 라기보다는 도메인을 먼저 개발하고,서비스(유스케이스),포트,어댑터 순으로 만들면서,외부에서 진입해서 테스트할수있는곳이 없으니 스터디용 테스트(주로 외부통신어댑터)와,도메인 유닛테스트로 기능을 만들고 바로 테스트하는식으로 테스트했음
이렇게 하면 따로 외부 인커밍어댑터 없이도 만든기능을 테스트하며 진행할수있음
어댑터는 스터디테스트로
class BasicFetcherTest {
@Test
fun successFetch() {
val basicFetcher = BasicFetcher(ApiHelperImpl())
val fetch = basicFetcher.fetch("1301110006246")
Assertions.assertThat(fetch["assetName"]).isEqualTo("삼성전자")
}
}
대충 이런식으로 받아보고
도메인은
class TrackedKoreanStocksTest {
@Test
@DisplayName("가지고있는 자산의 변동성을 체크할수있다")
fun checkVolatility() {
val trackedAssets = basicSetUpTrackedAssets()
val volatilityAssetList =
trackedAssets.hasVolatility(ResponserMock(CustomDateTimeMock("2021-01-01T00:00:00Z")))
val tickerList = volatilityAssetList.map { it.getIdentityCode() }
Assertions.assertThat(volatilityAssetList.size).isEqualTo(2)
Assertions.assertThat(tickerList.contains("notVol1")).isFalse()
}
private fun basicSetUpTrackedAssets(): TrackedKoreanStocks {
val stock1 = KoreanStock("volatility1", "삼성전자")
val stock2 = KoreanStock("volatility2", "롯데제과")
val stock3 = KoreanStock("notVol1", "LG전자")
val trackedKoreanStocks = TrackedKoreanStocks()
trackedKoreanStocks.addKoreanStock(stock1)
trackedKoreanStocks.addKoreanStock(stock2)
trackedKoreanStocks.addKoreanStock(stock3)
return trackedKoreanStocks
}
}
이런식으로 만들면서 테스트도 같이만들고있었음
이제 서비스테스트를 만들건데,서비스는 그냥 스프링붙여서 di받으면서,모킹해야하는(시간이나 외부통신하는거)클래스들은 모킹하면서 진행하면됨
@SpringBootTest
@Transactional
class MemberServiceTest
@Autowired
constructor(
private val memberRepository: MemberRepository,
) {
private val responser = ResponserMock(CustomDateTimeMock("2021-10-10T10:10:10"))
private val memberService = MemberService(memberRepository, responser)
@Test
@DisplayName("회원을 생성할수있다")
fun createMember() {
basicInit()
memberService.createMember(MemberCreateDto("newMember"))
Assertions.assertThat(memberRepository.existsByName("newMember")).isTrue()
}
@Test
@DisplayName("같은이름으로 회원을 생성할수없다")
fun duplicateCreateMember() {
basicInit()
memberService.createMember(MemberCreateDto("newMember"))
Assertions
.assertThatThrownBy { memberService.createMember(MemberCreateDto("newMember")) }
.isInstanceOf(IllegalArgumentException::class.java)
}
//...
@Test
@DisplayName("회원이 가지고있는 한국주식들중 변동성이 있는 주식들을 조회할수있다")
fun fetchVolatility() {
basicInit()
val koreanStocks = memberService.fetchVolatility(MemberVolatilityDto("member1"))
Assertions.assertThat(koreanStocks.size).isEqualTo(1)
Assertions.assertThat(koreanStocks.map { it.name }.toList()).contains("삼성전자")
}
private fun basicInit() {
val member1 = Member("member1")
member1.addKoreanStock(KoreanStock("130111-0006246", "삼성전자"))
member1.addKoreanStock(KoreanStock("110111-2487050", "LG전자"))
val member2 = Member("member2")
member2.addKoreanStock(KoreanStock("110111-4594952", "이마트"))
val member3 = Member("member3")
memberRepository.save(member1)
memberRepository.save(member2)
memberRepository.save(member3)
}
}
이런식으로 만들었음
나중에 유스케이스분리가 일어난다면,테스트떼다가 붙여주면됨
여기서 서비스와 레포지토리를 묶어서 테스트하고,컨트롤러와 dto(입력모델과 출력모델)는 나중에 따로 모킹라이브러리로 테스트해주면됨