π μ λ¬Έ μμ© 10μ₯ Java Unit Test
μλͺ»λ κ°λ°μ μμ± κΈ°μ€

μ¬λ°λ₯Έ μμ±μ κΈ°μ€

ν μ€νΈλ₯Ό ν΅ν νμ§ ν₯μ
ν μ€νΈ νλ λ°©λ²λ€
ν΅ν© ν μ€νΈ : μ¬λ¬κ° μ°κ΄λ ν΄λμ€λ₯Ό ν¨κ» ν μ€νΈ
λ¨μ(Unit) ν μ€νΈ
λ¨μ ν μ€νΈλ?
Java Unit Test
μλ° λ¨μ ν μ€νΈλ₯Ό μμ±ν λλ μΌλ°μ μΌλ‘ JUnit νλ μμν¬λ₯Ό μ¬μ©νλ€.
λ¨μ ν μ€νΈ μμ± λ°©λ²
- ν μ€νΈ λμ μ½λλ₯Ό μμ±ν©λλ€.
- JUnit νλ μμν¬λ₯Ό μ¬μ©νμ¬ ν μ€νΈ μΌμ΄μ€λ₯Ό μμ±ν©λλ€.
- μμ±ν ν μ€νΈ μΌμ΄μ€λ₯Ό μ€ννμ¬ μ½λμ λμμ κ²μ¦ν©λλ€.
- ν μ€νΈ κ²°κ³Όλ₯Ό λΆμνκ³ μ½λμ λν μμ μ΄ νμν λΆλΆμ νμ ν©λλ€.
μλνλ ν μ€νΈ μνκ³Ό ν μ€νΈ κ²°κ³Ό λΆμ κΈ°λ₯ λ±μΌλ‘ κ°λ°μλ€μ΄ μμ½κ² ν μ€νΈλ₯Ό μννκ³ κ°λ° ν¨μ¨μ±μ λμΌ μ μμ΅λλ€.

public class Account {
private String owner;
private int balance;
public Account(String owner, int balance) {
owner = owner;
balance = balance;
}
public void transfer(Account dest, int amount) {
dest.setBalance(dest.getBalance() + amount);
balance -= amount;
}
public String getOwner() {
return owner;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account [owner=" + owner + ", balance=" + balance + "]";
}
}
main λ©μλλ₯Ό κ°μ§λ ν μ€νΈ ν΄λμ€λ₯Ό μμ±
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("--- ν
μ€νΈ μμ ---");
Account account = new Account("νκΈΈλ", 30000);
System.out.println(account);
Account account2 = new Account("νμλ΄", 0);
account.transfer(account2, Integer.MAX_VALUE + 1);
if (account2.getBalance() != 2147483648L) {
System.out.println("getBalance() κ° λ€λ¦ " + account2.getBalance());
}
System.out.println("--- ν
μ€νΈ λ ---");
}
}

μμ±μ
μ μ€λ₯κ° μμκΈ°μ, μ΄κΈ° κ°μ΄ μ€μ λμ§ λͺ»νλ€.
ν μ€νΈ μΌμ΄μ€
// 1μ ~ 1μ΅
public void transfer(Account dest, int amount) {
dest.setBalance(dest.getBalance() + amount);
balance -= amount;
}
ν μ€νΈμ μ₯μ
- μ₯μ μ κ΄ν μ μν νΌλλ°±
- κ°λ° μ£ΌκΈ°μμ μ‘°κΈ° μ₯μ κ°μ§
- νκ·μ μ κ²½ μΈ νμ μμ΄ μ½λλ₯Ό μ΅μ ν ν μ μλλ‘ νλ λ μμ ν μ½λ 리ν©ν λ§
- κΈ°μ μ λ¬Έμ λ₯Ό μ΅μννλ μμ μ μΈ κ°λ° μλ
λ¨μ(Unit) ν μ€νΈκ° κΌ νμν κ²½μ°!
- μ€ν€λ§κ° λ³κ²½λλ κ²½μ°
- λͺ¨λΈ ν΄λμ€κ° λ³κ²½λλ κ²½μ°
Network
- μμΈ‘ν λ°μ΄ν°κ° μ λλ‘ λ€μ΄μ€λμ§
λ°μ΄ν° κ²μ¦
- μμΈ‘ν λ°μ΄ν°λ₯Ό μ λλ‘ μ²λ¦¬νκ³ μλμ§
JUnit νμ©νκΈ° - Java Unit Test μ©λμ λΌμ΄λΈλ¬λ¦¬ (API)
ν μ€νΈ νκ²½ μ€λΉ
ν μ€νΈ ν΄λ μμ±








ν μ€νΈ λμ μ½λ - Account κ³μ’ ν΄λμ€
package com.pkd.example;
public class Account {
private String owner;
private int balance;
// μμ±μ μ½λμ thisκ° μλ μ€λ₯κ° μλ€!
public Account(String owner, int balance) {
owner = owner;
balance = balance;
}
// 1μ ~ 1μ΅
public void transfer(Account dest, int amount) {
dest.setBalance(dest.getBalance() + amount);
balance -= amount;
}
public String getOwner() {
return owner;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account [owner=" + owner + ", balance=" + balance + "]";
}
}
ν μ€νΈ μ½λ
package com.pkd.test;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class AccountTest {
@Test
public void μμ±μ_ν
μ€νΈ() {
Account account = new Account("νκΈΈλ", 30000);
assertEquals("νκΈΈλ", account.getOwner()); // μμνλ κ°, μ€μ κ°
assertEquals(30000, account.getBalance());
}
}
assertXXX()
λ©μλλ₯Ό ν΅ν΄ μμΈ‘ κ°κ³Ό μ€μ κ°μ 체ν¬ν μ μλ€.

null
μ΄ λ€μ΄μμ΄ μ€λ₯κ° μλ κ²μ λ³Ό μ μλ€.
μμ±μ λλ²κΉ μ΄ν

Unit Test
μ μ μμ μΌλ‘ ν
μ€νΈμ ν΅κ³Όν λͺ¨μ΅μ΄λ€.
Transfer() λ©μλμ ν΄λΉνλ ν μ€νΈ μ½λ μΆκ°
package com.pkd.test;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class AccountTest {
@Test
public void μμ±μ_ν
μ€νΈ() {
Account account = new Account("νκΈΈλ", 30000);
assertEquals("νκΈΈλ", account.getOwner()); // μμνλ κ°, μ€μ κ°
assertEquals(30000, account.getBalance());
}
@Test
public void transfer_ν
μ€νΈ() {
Account account = new Account("νκΈΈλ", 30000);
Account account2 = new Account("νμλ΄", 0);
account.transfer(account2, 10000);
assertEquals(20000, account.getBalance()); // μμνλ κ°, μ€μ κ°
assertEquals(10000, account2.getBalance());
}
}

νΉμ ν μ€νΈκ° νΉμ μμΈκ° λ°μλλ κ²μ ν μ€νΈ

Mock κ°μ²΄ - κ°μ§ κ°μ²΄
Mock κ°μ²΄λ μ€μ κ°μ²΄λ₯Ό λμ νμ¬ ν μ€νΈμ μ¬μ©λλ κ°μ§ κ°μ²΄μ΄λ€. Mock κ°μ²΄λ ν μ€νΈ λμ€μ μ€μ κ°μ²΄λ₯Ό λ체νμ¬ ν μ€νΈλ₯Ό μ§νν μ μμΌλ©°, ν μ€νΈμ μμ‘΄μ±μ μ μ΄νλ λ° μ¬μ©λλ€.
Mock κ°μ²΄λ ν μ€νΈ λμ κ°μ²΄μ μμ‘΄νλ κ°μ²΄λ€ κ°μ μνΈμμ©μ ν μ€νΈνλ λ° μ μ©ν©λλ€. μλ₯Ό λ€μ΄, A κ°μ²΄κ° B κ°μ²΄μ μνΈμμ©νλ κ²½μ° A κ°μ²΄μ ν μ€νΈλ₯Ό μ§νν λ B κ°μ²΄λ₯Ό Mock κ°μ²΄λ‘ λ체νμ¬ ν μ€νΈλ₯Ό μνν μ μλ€. μ΄λ κ² νλ©΄ ν μ€νΈ μ€μ λ°μν μ μλ μΈλΆ μμ‘΄μ±μ λν μν₯μ μ΅μννκ³ ν μ€νΈ μΌμ΄μ€λ₯Ό λ κ²¬κ³ νκ² λ§λ€ μ μμ΅λλ€.
Javaμμλ Mockitoμ κ°μ Mocking νλ μμν¬λ₯Ό μ¬μ©νμ¬ Mock κ°μ²΄λ₯Ό μμ±νκ³ ν μ€νΈ μΌμ΄μ€μμ μ¬μ©ν μ μμ΅λλ€.
πμ°μ΅ λ¬Έμ
10-1

package com.pkd.examTest;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.pkd.exam.Bank;
public class BankTestTest {
//μ΄λ¦ 4κΈμ μ΄μ μ μ ν
μ€νΈ
@Test
public void μ μtest() {
Bank bank = new Bank();
bank.setName("νλμν");
assertEquals("νλμν", bank.getName());
}
// μ΄λ¦ 3κΈμ μ΄ν μμΈκ° λ°μν΄μΌ νλ κ²½μ° ν
μ€νΈ
@Test(expected = IllegalArgumentException.class)
public void μμΈtest() {
Bank bank = new Bank();
bank.setName("νλ");
}
}

10-2

package com.pkd.exam;
public class DownCounter {
private int count = 0;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void decrease() {
count--;
}
}
10-3

package com.pkd.examTest;
import static org.junit.Assert.*;
import org.junit.Test;
import com.pkd.exam.Counter;
import com.pkd.exam.DownCounter;
public class CounterTest {
@Test
public void counterTest() {
Counter counter = new Counter();
counter.setCount(10);
counter.increase();
counter.increase();
assertEquals(12, counter.getCount());
}
@Test
public void downCounterTest() {
DownCounter downCounter = new DownCounter();
downCounter.setCount(10);
downCounter.decrease();
downCounter.decrease();
assertEquals(8, downCounter.getCount());
}
}

10-4

package com.pkd.exam;
public class Counter {
private int count = 0;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void count() {
count++;
}
}
package com.pkd.exam;
public class DownCounter {
private int count = 0;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void count() {
count--;
}
}
10-5


package com.pkd.exam;
public interface Counter {
void count();
}
package com.pkd.exam;
public class DownCounter implements Counter{
private int count = 0;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public void count() {
count--;
}
}
package com.pkd.exam;
public class UpCounter implements Counter{
private int count = 0;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
@Override
public void count() {
count++;
}
}
package com.pkd.examTest;
import static org.junit.Assert.*;
import org.junit.Test;
import com.pkd.exam.UpCounter;
import com.pkd.exam.DownCounter;
public class CounterTest {
@Test
public void counterTest() {
UpCounter counter = new UpCounter();
counter.setCount(10);
counter.count();
counter.count();
assertEquals(12, counter.getCount());
}
@Test
public void downCounterTest() {
DownCounter downCounter = new DownCounter();
downCounter.setCount(10);
downCounter.count();
downCounter.count();
assertEquals(8, downCounter.getCount());
}
}

Uploaded by N2T