JUnit5 - JUnit ํ๊ฒฝ ์ธํ ๊ณผ ์ฒซ ๋ฒ์งธ ํ ์คํธ ์ผ์ด์ค ์์ฑ
๐ฌ <์๋ฐ์ JUnit์ ํ์ฉํ ์ค์ฉ์ฃผ์ ๋จ์ ํ ์คํธ> ์ฑ ์ ํตํด ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ์๋ค.
์ฒซ ๋ฒ์งธ JUnit ํ ์คํธ ๋ง๋ค๊ธฐ (p26 ~ p39)
๐ฌ ์ฑ ์ ๋์์๋ ์ฝ๋๋ฅผ ์ง์ ์์ฑํ๋ฉด์ ๊ณต๋ถํ๊ธฐ ์ํด IntelliJ์์ java 11 ๋ฒ์ ์ gradle ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค. ์ฑ ์ ์์ ์์๋ java 8์ stream์ ์ฌ์ฉํ๋ฏ๋ก ์ฐ์ต์ฉ ํ๋ก์ ํธ์ jdk๋ 8 ์ด์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
ํ ์คํธ ๋์ ์ฝ๋
๋ค์์ ํ ์คํธ ๋์ ์ฝ๋์ด๋ค.
๐ Scoreable.java
@FunctionalInterface
public interface Scoreable {
int getScore();
}
โ๏ธ ์ฐธ๊ณ - @FunctionalInterface
@FunctionalInterface๋ ํจ์ํ ์ธํฐํ์ด์ค์์ ๊ฐ๋ฆฌํค๋ ์ ๋ ธํ ์ด์ ์ด๋ค.
ํจ์ํ ์ธํฐํ์ด์ค๋ ์ค๋ก์ง ํ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ๋ ์ธํฐํ์ด์ค์ด๋ค.
์๋ฐ API์์ ์ ๊ณตํ๋ ํจ์ํ ์ธํฐํ์ด์ค๋ก๋ Comparator, Runnable ๋ฑ์ด ์๋ค.
@FunctionalInterface๋ฅผ ๋ถ์์ง๋ง ์ค์ ๋ก ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ์๋๋ฉด, ์ฆ ์ถ์ ๋ฉ์๋๊ฐ 1๊ฐ๋ฅผ ์ด๊ณผํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๐ ScoreCollection.java
public class ScoreCollection {
private List<Scoreable> scores = new ArrayList<>();
public void add(Scoreable scoreable) {
scores.add(scoreable);
}
public int arithmeticMean() { // ์ฐ์ ํ๊ท
int total = scores.stream().mapToInt(Scoreable::getScore).sum();
return total / scores.size();
}
}
ScoreCollection์ add() ๋ฉ์๋๋ Scoreable ์ธ์คํด์ค๋ฅผ ์ธ์๋ก ๋ฐ๊ณ , Scoreable ์ธํฐํ์ด์ค๋ intํ score ๊ฐ์ ๋ฐํํ๋ค.
๐ฌ arithmetic mean์ด๋ผ๋ ์ดํ๊ฐ ์ต์ํ์ง ์์ ์ฌ์ ๊ฒ์์ ํด๋ดค๋๋ '์ฐ์ ํ๊ท ' ์ด๋ผ๋ ๋ป์ด์๋ค. ๋ฉ์๋ ์ฐ์ธก์ ์ฃผ์์ผ๋ก ์ถ๊ฐํ์๋ค.
์์กด์ฑ ์ค์ ๋ฐ ํ ์คํธ ํ๊ฒฝ ๊ฒ์ฆ
ํ๋ก์ ํธ์ JUnit์ ์ฌ์ฉํ ์ ์๋๋ก ์ธํ ํ๊ณ ํ์ธํด๋ณด์.
ScoreCollection์ JUnit ํ ์คํธ ํด๋์ค๋ฅผ ์์ฑํ๋ค.
JUnit ๋ฒ์ ์ ์ฑ ์์๋ 4๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ด ์ค๋ฌด ํ๊ฒฝ์์๋ 5๋ฅผ ๋ง์ด ์ฌ์ฉํ๊ณ ๋ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์ 5๋ก ์ ํํ๋ค.
์ด๋ฅผ ์ํด ํ๋ก์ ํธ์ ์์กด์ฑ ์ค์ ์ JUnit5๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๋ณ๊ฒฝํด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ AssertJ์ assert๋ฌธ์ ์ฌ์ฉํ๊ธฐ ์ํด assertj-core๋ ์ถ๊ฐํ์๋ค.
๐ build.gradle
dependencies {
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.2'
testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.20.2'
}
๐ ScoreCollectionTest.java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.fail;
class ScoreCollectionTest {
@Test
void test() {
fail("Not yet implemented.");
}
}
JUnit์ @Test ์ ๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๋ฅผ ํ ์คํธ๋ก ์คํํ๋ค. ํ ์คํธ ํด๋์ค์๋ @Test๊ฐ ๋ถ์ง ์์ ์ผ๋ฐ ๋ฉ์๋๋ ํฌํจํ ์ ์์ผ๋ฉฐ JUnit์ ๊ทธ๋ฌํ ์ผ๋ฐ ๋ฉ์๋์ ์์์ ํ ์คํธ ์คํ์ ์ ์ธํ๋ค.
๐ฅ ์คํ ๊ฒฐ๊ณผ
fail() ๋ฉ์๋์ ์ํด ๋ฌด์กฐ๊ฑด ์คํจํ๋ ํ ์คํธ ๋ฉ์๋์ด๋ค.
AssertionFailedError ์ต์ ์ ์ด ๋ฐ์ํ๊ณ ์์ธ ๋ฉ์์ง๋ก์ fail() ๋ฉ์๋์ ์ธ์๋ก ๋๊ธด "Not yet implemented."๊ฐ ์ฝ์์ ์ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๐ScoreCollectionTest.java
@Test
void test() {
// fail("Not yet implemented.");
}
fail() ํธ์ถ์ ์ ๊ฑฐํ๋ฉด ํ ์คํธ ๋ฉ์๋๋ ์๋ฌด๊ฒ๋ ๊ฒ์ฆํ์ง ์์ผ๋ฏ๋ก ๋ฌด์กฐ๊ฑด ์ฑ๊ณตํ๋ค.
๐ฅ ์คํ ๊ฒฐ๊ณผ
์ด๋ ๊ฒ ๋ฌด์กฐ๊ฑด ์คํจํ๋ ํ ์คํธ, ๋ฌด์กฐ๊ฑด ์ฑ๊ณตํ๋ ํ ์คํธ๋ฅผ ์คํํด์ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉด JUnit์ ์ฌ์ฉํ ์ค๋น๊ฐ ๋ ๊ฒ์ด๋ค.
ํ ์คํธ ์ผ์ด์ค ์์ฑ
ํ ์คํธ ์ผ์ด์ค๋ ํ๊ฒ ์ฝ๋์ ๋ํ ๊ธฐ๋ ํ๋์ ์ ๊ณตํ๋ ์๋๋ฆฌ์ค์ด๋ค.
์์ฑํ ํ ์คํธ ์ผ์ด์ค๋ ScoreCollection์ ๋ฉค๋ฒ ๋ฆฌ์คํธ scores์ ์ ์ 5, 7์ ์ถ๊ฐํ๊ณ arithmeticMean() ๋ฉ์๋๊ฐ 6์ ๋ฐํํ๋์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
๊ธฐ์กด์ JUnit์ด ์ ๋๋ก ์คํ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์์ฑํ๋ ์๋ฏธ์๋ ํ ์คํธ ๋ฉ์๋๋ ์ญ์ ํ๊ณ ์๋์ ๊ฐ์ด ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ค.
๐ ScoreCollectionTest.java
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
class ScoreCollectionTest {
@DisplayName("๋ ์์ ์ฐ์ ํ๊ท ์ฑ๊ณต ํ
์คํธ")
@Test
void arithmeticMeanOfTwoNumbers() {
// given
ScoreCollection scoreCollection = new ScoreCollection();
scoreCollection.add(() -> 5);
scoreCollection.add(() -> 7);
// when
int actual = scoreCollection.arithmeticMean();
// then
assertThat(actual).isEqualTo(6);
}
}
JUnit5๋ฅผ ์ฌ์ฉํด์ public์ ์๋ตํ๊ณ @DisplayName ์ ๋ ธํ ์ด์ ์ ์ด์ฉํด ํ ์คํธ ์ผ์ด์ค์ ๋ด์ฉ์ ๋์ฑ ๋ช ์์ ์ผ๋ก ์์ฑํ ์ ์๋ค.
assertThat()์ AssertJ์ ๋ฉ์๋๋ฅผ static import ํ์ฌ ์ฌ์ฉํ์๋ค.
์ฑ ์์๋ ์ด ์ฒซ ๋ฒ์งธ ํ ์คํธ๋ฅผ ์ค๋น, ์คํ, ๋จ์ธ ๋จ๊ณ๋ก ๋๋์ด ์ค๋ช ํ์๋ค.
๊ทธ ๋ณด๋ค ์ต์ํ๊ณ ๋ง์ด ์ฌ์ฉ๋๋ ์ฉ์ด๋ given, when, then ์ธ ๊ฒ ๊ฐ๋ค.
given - ์ค๋น ๋จ๊ณ
ํ ์คํธ ์ํ๋ฅผ ์ค์ ํ๋ ์ค๋น ๋จ๊ณ
ScoreCollection ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๋๋ค์์ผ๋ก Scoreable์ ๋๊ฒจ add()๋ฅผ ๋ ๋ฒ ํธ์ถํ ๊ฒ์ด ์ด ๋จ๊ณ์ด๋ค.
when - ์คํ ๋จ๊ณ
๊ฒ์ฆํ๋ ค๋ ์ฝ๋๋ฅผ ์คํํ๋ ๋จ๊ณ
ScoreCollection์ arithmeticMean()์ ํธ์ถํ์๋ค.
then - ๋จ์ธ ๋จ๊ณ
๊ธฐ๋ํ๋ ๊ฒฐ๊ณผ๋ฅผ assert(๋จ์ธ)ํ๋ ๋จ๊ณ
AssertJ์ assertThat()์ ์ค์ ๋์จ ๊ฒฐ๊ณผ๊ฐ actual์ ๋๊ธฐ๊ณ , ์ฒด์ด๋ ๋ฉ์๋๋ก isEualTo()์ ๊ธฐ๋๊ฐ์ธ 6์ ๋๊ฒจ ํธ์ถํ์๋ค.
๐ฅ ์คํ ๊ฒฐ๊ณผ
์ด ํ ์คํธ ์ผ์ด์ค๊ฐ ์คํจํ๋๋ก ๋ณ๊ฒฝํด๋ณด์.
๐ ScoreCollectionTest.java
...
// then
assertThat(actual).isEqualTo(100);
...
๐ฅ ์คํ ๊ฒฐ๊ณผ
๊ธฐ๋๊ฐ์ 100์ด๋ ์ค์ ๊ฒฐ๊ณผ๊ฐ์ 6์ด๋ผ๋ ๋ฉ์์ง๊ฐ ์ฝ์์ ์ฐํ๋ค.
์๋์ ๊ฐ์ด assert๋ฌธ์ ๋ฐ๊ฟ์ผ๋ก์จ ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋๋ก ๋ฐ๊ฟ ์๋ ์๋ค.
๐ ScoreCollectionTest.java
...
// then
assertThat(actual).isNotEqualTo(100);
...
๐ฅ ์คํ ๊ฒฐ๊ณผ