ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java μ‘μš©] 10. Java Unit Test (JUnit)
    Dev/Java 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
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Keydi's Tistory