Dev/Java

[Java μ‘μš©] 10. Java Unit Test (JUnit)

KeyDi 2023. 3. 26. 23:45
728x90

πŸ“˜ μž…λ¬Έ μ‘μš© 10μž₯ Java Unit Test

잘λͺ»λœ 개발의 μ™„μ„± κΈ°μ€€

πŸ’‘
클래슀λ₯Ό μž‘μ„±ν–ˆλ‹€κ³  μ™„μ„±ν–ˆλ‹€κ³  말할 수 μžˆλŠ”κ°€?

μ˜¬λ°”λ₯Έ μ™„μ„±μ˜ κΈ°μ€€

πŸ’‘
μ‹€μ œ κ°œλ°œμ— μžˆμ–΄μ„œ ν’ˆμ§ˆκΉŒμ§€λ„ κ³ λ €ν•΄μ•Ό ν•œλ‹€. ν’ˆμ§ˆμ„ κ³ λ €ν•œλ‹€λ©΄ μ‹€μ œ μ™„μ„±κΉŒμ§€ 더 λ§Žμ€ μ‹œκ°„μ΄ ν•„μš”ν•  수 μžˆλ‹€.

ν…ŒμŠ€νŠΈλ₯Ό ν†΅ν•œ ν’ˆμ§ˆ ν–₯상

ν…ŒμŠ€νŠΈ ν•˜λŠ” 방법듀

πŸ’‘
μˆ˜λ™ ν…ŒμŠ€νŠΈ : 인간이 ν•˜λŠ” ν…ŒμŠ€νŠΈ λ‹¨μœ„ ν…ŒμŠ€νŠΈ : 1개 클래슀λ₯Ό ν…ŒμŠ€νŠΈ

톡합 ν…ŒμŠ€νŠΈ : μ—¬λŸ¬κ°œ μ—°κ΄€λœ 클래슀λ₯Ό ν•¨κ»˜ ν…ŒμŠ€νŠΈ

λ‹¨μœ„(Unit) ν…ŒμŠ€νŠΈ

λ‹¨μœ„ ν…ŒμŠ€νŠΈλž€?

πŸ’‘
νŠΉμ • λͺ¨λ“ˆμ΄ μ˜λ„ν•œ λŒ€λ‘œ 잘 μž‘λ™ν•˜λŠ” κ°€λ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” 것
πŸ’‘
λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 방법둠 쀑 ν…ŒμŠ€νŠΈ 주도 개발(TDD)을 λ”°λ₯΄λŠ” 경우 λ”μš± μ€‘μš”ν•΄μ§€λ©°, κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œκ°€ μ˜ˆμƒλŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€λ₯Ό κ²€μ¦ν•˜λŠ” 것이 λͺ©μ 

Java Unit Test

πŸ’‘
μžλ°” λ‹¨μœ„ ν…ŒμŠ€νŠΈ(Java Unit Test)

μžλ°” λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•  λ•ŒλŠ” 일반적으둜 JUnit ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•œλ‹€.

πŸ’‘
JUnitμ΄λž€? μžλ°” λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” μ˜€ν”ˆμ†ŒμŠ€ ν”„λ ˆμž„μ›Œν¬λ‘œ, κ°œλ°œμžκ°€ μž‘μ„±ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μžλ™μœΌλ‘œ μ‹€ν–‰ν•˜κ³  κ²€μ¦ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± 방법

πŸ’‘
JUnit μ‚¬μš©ν•œ μžλ°” λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± 방법
  1. ν…ŒμŠ€νŠΈ λŒ€μƒ μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
  1. JUnit ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.
  1. μž‘μ„±ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ½”λ“œμ˜ λ™μž‘μ„ κ²€μ¦ν•©λ‹ˆλ‹€.
  1. ν…ŒμŠ€νŠΈ κ²°κ³Όλ₯Ό λΆ„μ„ν•˜κ³  μ½”λ“œμ— λŒ€ν•œ μˆ˜μ •μ΄ ν•„μš”ν•œ 뢀뢄을 νŒŒμ•…ν•©λ‹ˆλ‹€.

μžλ™ν™”λœ ν…ŒμŠ€νŠΈ μˆ˜ν–‰κ³Ό ν…ŒμŠ€νŠΈ κ²°κ³Ό 뢄석 κΈ°λŠ₯ λ“±μœΌλ‘œ κ°œλ°œμžλ“€μ΄ μ†μ‰½κ²Œ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•˜κ³  개발 νš¨μœ¨μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’‘
ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ—λŸ¬λ₯Ό μ°Ύμ•„λ³΄μž
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("--- ν…ŒμŠ€νŠΈ  끝  ---");
    }
}
πŸ’‘
μƒμ„±μžμ— 였λ₯˜κ°€ μžˆμ—ˆκΈ°μ—, 초기 값이 μ„€μ •λ˜μ§€ λͺ»ν–ˆλ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€

πŸ’‘
κ°€λŠ₯ν•œ λͺ¨λ“  κ°€λŠ₯μ„±μ˜ λ²”μœ„λ₯Ό ν…ŒμŠ€νŠΈ ν•˜λŠ” 것이 쒋은 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ΄λ‹€. λ©”μ„œλ“œμ˜ input으둜 올 수 μžˆλŠ” λ‹€μ–‘ν•œ 경우의 수, λ“€μ–΄μ˜¬ 수 μžˆλŠ” 수의 λ²”μœ„ (int ν˜• λ²”μœ„) λ“±

    // 1원 ~ 1μ–΅
    public void transfer(Account dest, int amount) {
        dest.setBalance(dest.getBalance() + amount);
        balance -= amount;
    }
πŸ’‘
예λ₯Ό λ“€μ–΄ μ†‘κΈˆ μ΅œλŒ€ λ²”μœ„ μ œμ•½μ΄ 1원~1얡일 λ•Œ, ν•΄λ‹Ή 전체 λ²”μœ„κ°€ ν¬ν•¨λ˜λ„λ‘ ν…ŒμŠ€νŠΈν•΄μ•Ό ν•œλ‹€. μ˜ˆμ‹œ) 1, 2, 99999999, 1μ–΅ : 성곡 0, 1μ–΅, 1원 : μ‹€νŒ¨

ν…ŒμŠ€νŠΈμ˜ μž₯점

  • μž₯애에 κ΄€ν•œ μ‹ μ†ν•œ ν”Όλ“œλ°±
  • 개발 μ£ΌκΈ°μ—μ„œ μ‘°κΈ° μž₯μ•  감지
  • νšŒκ·€μ— μ‹ κ²½ μ“Έ ν•„μš” 없이 μ½”λ“œλ₯Ό μ΅œμ ν™” ν•  수 μžˆλ„λ‘ ν•˜λŠ” 더 μ•ˆμ „ν•œ μ½”λ“œ λ¦¬νŒ©ν† λ§
  • 기술적 문제λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” μ•ˆμ •μ μΈ 개발 속도

λ‹¨μœ„(Unit) ν…ŒμŠ€νŠΈκ°€ κΌ­ ν•„μš”ν•œ 경우!

πŸ’‘
DB
  • μŠ€ν‚€λ§ˆκ°€ λ³€κ²½λ˜λŠ” 경우
  • λͺ¨λΈ ν΄λž˜μŠ€κ°€ λ³€κ²½λ˜λŠ” 경우

Network

  • μ˜ˆμΈ‘ν•œ 데이터가 μ œλŒ€λ‘œ λ“€μ–΄μ˜€λŠ”μ§€

데이터 검증

  • μ˜ˆμΈ‘ν•œ 데이터λ₯Ό μ œλŒ€λ‘œ μ²˜λ¦¬ν•˜κ³  μžˆλŠ”μ§€

JUnit ν™œμš©ν•˜κΈ° - Java Unit Test μš©λ„μ˜ 라이브러리 (API)

ν…ŒμŠ€νŠΈ ν™˜κ²½ μ€€λΉ„

ν…ŒμŠ€νŠΈ 폴더 μž‘μ„±

πŸ’‘
ν…ŒμŠ€νŠΈ ν•  폴더λ₯Ό 생성
πŸ’‘
이번 μ‹€μŠ΅μ—μ„œλŠ” ν…ŒμŠ€νŠΈ 클래슀 μ½”λ“œλ₯Ό μ €μž₯ν•  νŒ¨ν‚€μ§€λ₯Ό λ³„λ„λ‘œ λ§Œλ“œλŠ” κ²ƒμœΌλ‘œ λŒ€μ²΄ν–ˆλ‹€.

πŸ’‘
project > properties > Java Build Path > Libraries νƒ­ > Classpath > Add Library > JUnit μΆ”κ°€ (JUnit4)

πŸ’‘
ν…ŒμŠ€νŠΈ ν•  클래슀 우클릭 New β†’ Other

πŸ’‘
JUnit Test Case 선택 β†’ Next ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ λ³Έ μ½”λ“œμ™€ μ„žμ΄μ§€ μ•Šλ„λ‘, Package 이름 μˆ˜μ •

πŸ’‘
fail() μ§€μš°κ³  여기에 ν•΄λ‹Ή ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λœλ‹€!

ν…ŒμŠ€νŠΈ λŒ€μƒ μ½”λ“œ - Account κ³„μ’Œ 클래슀

πŸ’‘
μƒμ„±μž μ½”λ“œμ— this.λ₯Ό μƒλž΅ν•΄ 였λ₯˜κ°€ μžˆλŠ” μ½”λ“œμ΄λ‹€.
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());
    }
}
πŸ’‘
transfer μ†‘κΈˆμ— λŒ€ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μž‘μ„±ν–ˆλ‹€.
πŸ’‘
μ •μƒμ μœΌλ‘œ 두가지 ν…ŒμŠ€νŠΈμ— ν†΅κ³Όν–ˆλ‹€.
πŸ’‘
이처럼 μ—¬λŸ¬ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μΆ”κ°€ν•΄κ°€λ©΄μ„œ 각 클래슀의 λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•  수 μžˆλ‹€.

νŠΉμ • ν…ŒμŠ€νŠΈκ°€ νŠΉμ • μ˜ˆμ™Έκ°€ λ°œμƒλ˜λŠ” 것을 ν…ŒμŠ€νŠΈ

πŸ’‘
κ°œλ°œμžκ°€ μ˜λ„ν•œ μ˜ˆμ™Έκ°€ λ°œμƒλ˜μ–΄μ•Ό ν•˜λŠ” 것을 ν…ŒμŠ€νŠΈ ν•˜κΈ° μœ„ν•œ μ½”λ“œμ΄λ‹€. annotation 뢀뢄에, @Test( expected = μ˜ˆμ™Έ.class) λ₯Ό λͺ…μ‹œν•˜μ—¬ μ˜λ„ν•œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” 것을 체크할 수 μžˆλ‹€.
πŸ’‘
μ•„λž˜, μ—°μŠ΅λ¬Έμ œ 10-1 λΆ€μ—° μ„€λͺ… μ°Έκ³ 

Mock 객체 - κ°€μ§œ 객체

πŸ’‘
Interfaceλ₯Ό ν™œμš©ν•˜μ—¬ κ°€μ§œ 객체λ₯Ό μž‘μ„±ν•˜μ—¬ ν…ŒμŠ€νŠΈ ν•  수 μžˆλ‹€.

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("ν•˜λ‚˜");
    }
}
πŸ’‘
JUnit ν…ŒμŠ€νŠΈ κ²°κ³Ό μ •μƒμ μœΌλ‘œ ν…ŒμŠ€νŠΈ λ˜μ—ˆλ‹€. 1. setName()μ—μ„œ 이름이 4κΈ€μž μ΄μƒμ˜ 정상적인 경우 β†’ assertEquals();λ₯Ό 톡해 μ˜ˆμƒλ˜λŠ” κ°’κ³Ό μ‹€μ œ κ°’μ˜ λΉ„κ΅λ‘œ μ •μƒμ μž„μ„ ν…ŒμŠ€νŠΈ 2. 이름이 3κΈ€μž μ΄ν•˜ μ˜ˆμ™Έκ°€ λ°œμƒν•΄μ•Ό ν•˜λŠ” 경우 β†’ @Test(expected = IllegalArgumentException.class) 을 톡해 μ˜ˆμƒλ˜λŠ” μ˜ˆμ™Έμ™€ μ‹€μ œ λ°œμƒλ˜λŠ” μ˜ˆμ™Έμ˜ 비ꡐλ₯Ό 톡해 μ •μƒμ μœΌλ‘œ μ˜ˆμ™Έμ²˜λ¦¬ 됨을 ν…ŒμŠ€νŠΈν•  수 μžˆμ—ˆλ‹€.

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());
    }
}
πŸ’‘
μœ„ Unit ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ •μƒμ μœΌλ‘œ μΉ΄μš΄ν„°κ°€ μž‘λ™ν•˜λŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€.

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++;
    }
}
πŸ’‘
Counter μΈν„°νŽ˜μ΄μŠ€λ₯Ό UpCounter와 DownCounterκ°€ κ΅¬ν˜„ν•˜λŠ” ν˜•νƒœλ‘œ λ¦¬νŒ©ν† λ§ ν–ˆλ‹€.

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

728x90
λ°˜μ‘ν˜•