jUnit과 Mockito를 이용한 단위테스트 기초 2일차

20 Jun 2017 JUnit, mockito

단위테스트 작성

  • 소스코드와 단위테스트 코드를 분리, 소스코드는 src 폴더 하위에, 테스트 코드는 test 폴더 하위에 작성1
  • 물리적으로는 다른 위치에 작성하지만, 패키지는 동일하게 유지하여 테스트 코드를 용이하게 관리

패키지위치

  • JUnit 단위테스트 클래스의 기본 구조
  • 한 클래스에 여러 개의 테스트 메소드를 작성 가능
  • 테스트 클래스의 이름은 [테스트 대상 클래스이름+Test]와 같은 형태로 명명을 권장
  • @Before, @After 어노테이션을 사용해서 테스트 전, 후 작업을 정의

단위테스트 클래스 기본 구조

public class TestFixtureExample {

  private Calculator calculator;

  @BeforeClass
  public static void setUpClass(){
   /*테스트 시작 전 테스트 대상 클래서에서
   한 번만 수행되어야 할 부분 설정
   ex.데이터베이스 드라이버 로딩정보*/
  }

  @AfterClass
  public static void tearDownClass(){
   /*테스트가 끝난 후 테스트 대상 클래서에서
   한 번만 수행되어야 할 부분을 설정
   ex.데이터베이스 해제*/
  }

  @Before
  public void setUp() {
    /*테스트 시작 전 매번 수행하는 설정
    ex.데이터베이스 로그인 정보*/
    calculator = new Calculator();
  }

  @After
  public void tearDown(){
   /*테스트 종료 후 매번 수행하는 설정
   ex.데이터베이스 로그인 정보 해제*/
  }

  @Test
  public void testAdd() {
    int result = calculator.add(10, 20);
    assertEquals(30, result);
  }

  @Test
  public void testDiv() {
    int result = calculator.div(100, 5);
    assertEquals(20, result);
  }
}

테스트 suite

  • 관련된 단위테스트들을 묶어서 수행
  • @RunWith 어노테이션을 이용해서 테스트 슈트 클래스를 지정
  • @SuiteClasses 어노테이션을 이용해서 묶어서 실행할 테스트 클래스를 지정
  • 테스트 자동화목적으로는 사용X (테스트 자동화는 별도의 도구를 사용하는 방식을 더 선호)
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({
  ArrayToArrayListTest.class, BankTransferActionTest.class, ListIteratorTest.class, ListTest.class,
  MoneyConstructorTest.class, PropertiesTest.class, RightExceptionTest.class, SongTest.class
})
public class AllTests{

}

Hamcrest

  • jUnit 4에서 Hamcrest library 추가
  • assertThat()2 메소드 - 공학적인 느낌보다는 조금 더 부드러운 문맥적인 흐름을 만들어 줌
import org.junit.Test;
import static org.hamcrest.CoreMatchers.*;

public class HamcrestExmaple {

  @Test
  public void HamcrestTest(){
  /*
    assertEquals(기대값, 테스트결과값);  
  ->assertThat(기대값, is(테스트결과값));
  */
    assertEquals("kim", user.getId());
    assertThat(user.getId(), is("kim"));
  }
}
  1. 빌드할때 test폴더는 빌드에서 자동으로 제외하는 기능을 지원 

  2. is(not(3)) 이나 eather(2).or(3) 같은 조합을 이뤄서 사용할 수 있음(커스텀 Matchers 가능)