๐ก ํ ์คํธ ํ๊ฒฝ์์ private ๋ฉ์๋๋ฅผ ๊ฒ์ฆํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ์๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํ์ตํ์์ต๋๋ค.
private ํจ์ ํ ์คํธ ๋ฌธ์ ์
- MonthPicker ํด๋์ค๋ ์ ํจํ ๋ฌ์ ๊ฒ์ฌํ๊ณ , ๋ชจ๋ ๋ฌ์ ์ผ์ 30์ผ๋ก ๊ฐ์ ํ์ฌ ํฉ์ ๊ตฌํ๋ ํด๋์ค์ ๋๋ค.
- makeDays๋ฅผ ํตํด์ ๋ด๋ถ์ ๊ฐ๋ณ์ธ์๋ก ๋ค์ด์จ ๊ฐ์ด ๋ชจ๋ ์ ํํ ๋ฌ์ธ์ง isValid๋ฅผ ํตํด ๊ฒ์ฌํ๊ณ ์์ต๋๋ค.
class MonthPicker() {
fun makeDays(vararg months: Int): Int {
if (isValid(*months)) throw IllegalArgumentException(ERROR_MONTH)
return months.reduce { acc, month ->
acc + month * DAY_OF_MONTH
}
}
private fun isValid(vararg months: Int): Boolean {
return months.all { it in START_MONTH .. END_MONTH }
}
companion object {
private const val START_MONTH = 1
private const val END_MONTH = 12
private const val DAY_OF_MONTH = 30
private const val ERROR_MONTH = "์ฌ๋ฐ๋ฅธ ๋ฌ์ด ์๋๋๋ค."
}
}
- makeDays์ ๋ํ ํ ์คํธ๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, isValid ํจ์๋ private๋ก ์ ์ธ๋์ด ํ ์คํธ๊ฐ ์ด๋ ต์ต๋๋ค.
์ฑ ์ ๋ถ๋ฆฌ
- ๊ฐ์ฒด ๋ด๋ถ์ private๋ก ์ ์ธ๋ ํจ์๊ฐ ์๋ค๋ ๊ฒ์, ๊ฐ์ฒด๊ฐ ์์ ์ ์ฑ ์์ด ์๋ ์ญํ ๊น์ง ํ๊ณ ์๋ค๋ ๊ฒ์ ๋ปํ ์๋ ์์ต๋๋ค.
- ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฑ ์์ ๊ฐ์ ธ๊ฐ๋๋ก ๋ถ๋ฆฌํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ์์ต๋๋ค.
class MonthPicker(
private val monthValidator: MonthValidator
) {
fun makeDays(vararg months: Int): Int {
if (monthValidator.isValid(*months)) throw IllegalArgumentException(ERROR_MONTH)
return months.reduce { acc, month ->
acc + month * DAY_OF_MONTH
}
}
companion object {
private const val DAY_OF_MONTH = 30
private const val ERROR_MONTH = "์ฌ๋ฐ๋ฅธ ๋ฌ์ด ์๋๋๋ค."
}
}
class MonthValidator(){
fun isValid(vararg months: Int): Boolean {
return months.all { it in START_MONTH .. END_MONTH }
}
companion object {
private const val START_MONTH = 1
private const val END_MONTH = 12
}
}
- MonthValidator() ํด๋์ค๊ฐ ํด๋น ์ฑ ์์ ๊ฐ์ ธ๊ฐ๋๋ก ์์ ํ์์ต๋๋ค.
- ์ด๋ก ์ธํด์ ๊ฐ ํด๋์ค๋ฅผ ๋ฐ๋ก ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
- ํ์ง๋ง ๋ง์ ์์กด์ฑ์ด ์๊ฒจ์ ์ฑ ์์ ๋ถ๋ฆฌํ ์ ์๋ ์ํฉ์ด ์๊ณ , ์ฑ ์์ ์ง๋์น๊ฒ ๋ถ๋ฆฌํ๋ฉด ๋๋ฏธํฐ์ ๋ฒ์น์ ์๋ฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.
ํธ์ถํ๋ ํจ์๋ฅผ ํ ์คํธ
- private ํจ์๋ฅผ ํ ์คํธํ๊ธฐ ์ํด์ private ํจ์๋ฅผ ํธ์ถํ๋ public ํจ์๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
class MonthPikerTest {
private lateinit var monthPicker: MonthPicker
@BeforEach
fun setUp() {
monthPicker = MonthPicker()
}
@Test
fun `test isValid`() {
// then
asserThrows(java.lang.IllegalArgumentException::class.java){
monthPicker.makeDays(0)
}
}
}
- ์์ ๊ฐ์ด private๋ฅผ ํธ์ถํ๋ ํจ์๋ฅผ ํ ์คํธํ์ฌ ์ ์์ ์ธ ํ ์คํธ๋ฅผ ์งํํ ์ ์์ต๋๋ค.
- ํ์ง๋ง ์ด๋ ์๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์ธ๋ถ ๋์์ ์ง์ ํ ์คํธํ์ง ๋ชปํ๋ค
- ๊ตฌ์ฒด์ ์ธ ์์ธ ๋ถ์์ด ์ด๋ ต๋ค
- ํ ์คํธ ์ฝ๋์ ์๋ฏธ์ ๋ฒ์๊ฐ ๋ถํ์คํ๋ค
- ๋ฆฌํฉํ ๋ง์ ์ทจ์ฝํ๋ฉฐ ํ ์คํธ์ ์๋ฏธ๋ฅผ ์๊ฐํ์ ๋ ์๋ชป๋ ์ ์๋ค
mockk ํ์ฉ
- Mockk๋ ์ฝํ๋ฆฐ์ ์ํ Mock ํ๋ ์์ํฌ์ ๋๋ค.
- Repository, Api ํธ์ถ ๋ฉ์๋์ ๊ฐ์ด ์ธ๋ถ ์์กด์ฑ์ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ mockingํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๊ณ , private ํจ์๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
class MonthPickerTest {
@Test
fun `test makeDays with valid months`() {
// MonthValidator๋ฅผ ๋ชจํน
val monthValidator = mockk<MonthValidator>()
// ๋ชจํน๋ MonthValidator๊ฐ ํญ์ true๋ฅผ ๋ฐํํ๋๋ก ์ค์
every { monthValidator.isValid(anyVararg()) } returns true
// MonthPicker์ ๋ชจํน๋ MonthValidator๋ฅผ ์ฃผ์
val monthPicker = MonthPicker(monthValidator)
// ์ ํจํ ์์ผ ๊ฒฝ์ฐ ์ ์์ ์ผ๋ก ๊ณ์ฐ
val result = monthPicker.makeDays(1, 2, 3)
// 1, 2, 3๊ฐ์์ ํฉ๊ณ * 30์ผ = 180์ผ
assertEquals(180, result)
}
@Test
fun `test makeDays with invalid months`() {
// MonthValidator๋ฅผ ๋ชจํน
val monthValidator = mockk<MonthValidator>()
// ๋ชจํน๋ MonthValidator๊ฐ ํญ์ false๋ฅผ ๋ฐํํ๋๋ก ์ค์
every { monthValidator.isValid(anyVararg()) } returns false
// MonthPicker์ ๋ชจํน๋ MonthValidator๋ฅผ ์ฃผ์
val monthPicker = MonthPicker(monthValidator)
// ์ ํจํ์ง ์์ ์์ผ ๊ฒฝ์ฐ ์์ธ ๋ฐ์
val exception = assertThrows<IllegalArgumentException> {
monthPicker.makeDays(13, 14)
}
// ์์ธ ๋ฉ์์ง ํ์ธ
assertEquals("์ฌ๋ฐ๋ฅธ ๋ฌ์ด ์๋๋๋ค.", exception.message)
}
- spyk๋ก ์ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ทธ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ๋ชจํนํ์์ต๋๋ค.
- every๋ก private ๋ฉ์๋ ๋ชจํน
- every { monthPicker"๋ฉ์๋๋ช ” } returns false or true
- ์์ ๊ฐ์ ํ์์ผ๋ก ํญ์ false๋ true๋ฅผ ๋ฐํํ๋๋ก ํฉ๋๋ค.
- ์ด๋ฅผ ํตํด ์์ด ์ ํจํ์ง ์๋ค๊ณ ํ๋จํ๋๋ก ์ค์ ํ์ฌ ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค.
- verify๋ก ํธ์ถ ๊ฒ์ฆ
- isValid ๋ฉ์๋๊ฐ ํน์ ์ธ์์ ํจ๊ป ํธ์ถ๋์๋์ง๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
๊ฒฐ๊ณผ
- ์ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ private ๋ฉ์๋๋ฅผ ๋ชจํนํ๊ณ , ์ด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก public ๋ฉ์๋๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.