ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TDD ( Junit4 + Mokito + AssertJ ) 겉핥기 2
    Java/TDD 2019. 1. 29. 11:38
    반응형

    TDD 시작 ! 



     일단 Java( Spring framework) 프로젝트였기 때문에 Junit 을 먼저 찾아 봤다. 


    Junit 은 java 에서만 사용하는건 아닌거 같다. C, C++ Php , Python  다른언어들도 사용가능한 기능을 제공 한다. 


    생각보다 기능 사용은 어렵지 않다 maven 을 사용한다면 pom.xml 에 dependency 만 추가 하면 된다. 



    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    Spring 에서 사용할땐 어노테이션을 붙여주면 Junit 사용이 가능하다. 


    @Test  : 테스트 대상 

    @BeforeClass : 테스트가 시작전 딱 한번만 수행 

    @AfterClass  : 테스트가 끝나고 딱 한번씩 수행 하도록 함.

    @Before :  테스트가 진행 시작 되기전에 호출.

    @After :  테스트가 진행이 끝난 후에 작업할 내용을 호출

    @Ignore : 테스트 케이스를 무시함.


     다음은 Mokito !  단위 테스트를 위한 Java Mocking framework 이다. java 는 참 프레임워크가 많은거 같다. 테스트 마자도 프레임워크가 있다니 이녀석도 maven 을 사용한다면 적용은 쉽다. 


    <!-- https://mvnrepository.com/artifact/org.mockito/mockito-all -->
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.10.19</version>
        <scope>test</scope>
    </dependency>

    dependency 에 추가해주면 된다.  Mokito 의 핵심 기능은 @Mock, @InjectMocks 두가지 같다.  @Mock 으로 지정해주어 객체를 생성해주고 가상으로 만들어진 객체를 실제 테스트 코드로 이용하면 된다. 


    해당 내용을 찾다보니 대부분 소스코드로 제공하고 그 내용들은 검증/실패/성공 등으로 표시하는데 솔직히 이해가 잘안갔다. Mock 뭔지도 모르는데 검증하는 소스를 봐도 도대체 저게 내부적으로 어떻게 하길래 검증이 되는건가 싶었다. 


    그래서 내가 이해한걸 까먹지 않으려 정리해서 남긴다 ( 건망증이 나날이 심해지고 있다. ) 


    @Mock 으로 선언된 객체는 실제로 객체안에 아무것도 들어가 있지 않다. 그렇기 때문에  실제로 객체를 선언하고 객체안에 메서드를 호출해서 실행 해보면 에러가 나거나 아무 동작을 하지 않는다 


    그럼 어떻게 사용하나 ! 


    verify 같은걸 사용하면 호출 됬는지 어떤 행위가 일어나는지 확인이 가능하다. 근데 솔직히 이걸 쓸일이 있나 싶기도 하다. 내가 좀더 TDD에 대한 능력이 대단해지면 쓸일이 있겠지만 초보자로써 그닥 쓸 이유를 찾지 못했다. 


    stubbing ! 이건 쓸거 같다. 아주 단순한거지만 Mock 으로 생성된 객체에 특정 조건을 부여한다. 단순히 말하면 "넌 이런값요청이 오면 이걸 던져주면되! " 라고 알려주는것이다. 


    //stubbing
    when(mock.add("tdd test")).thenReturn("test"); 
    when(mock.delete("123")).thenThrow(new Exception()); 

     

     저렇게 설정된 애들은 해당값들이 올경우 각자 설정된 값으로 리턴하게 된다. 굳이 데이터베이스를 안다녀와도 되고 ! 좋다!!  실제로 TDD 를 하려고 시작하면 데이터베이스는 어떻게 이용하지 ? 란 생각이 먼저 들었다.  Mockito 를 이용하면 굳이 데이터베이스 까지 안가도된다.   근데 생각보다 요청값/응답값 설정하는게 굉장히 노가다 작업이였다... 초보라... ㅠㅠ 뭔가 편하게 할수있방법이 있을지도 모르겠다.


    단순 값만이 아니라 Exception 이나  JSON 값을 반환하도록 해도 된다. 


    이외에 순서검증, 호출횟수 등 여러가지를 검증이 가능하다 이런 각각의 기능을 잘 조합해서 사용하면 일련의 프로세스가 작성이 가능할거 같다. 


    ( 참고 사이트 : http://static.javadoc.io/org.mockito/mockito-core/2.22.0/org/mockito/Mockito.html ) 



    AsserJ


     테스트 코드를 좀더 멋(?)스럽게 작성이 가능하도록 해주는 라이브러리 이다. 기본적으로 Java 8 이상 사용자라면 3.x 버전 으로 사용하는게 좋다 . 

    
    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>3.6.2</version>
        <scope>test</scope>
    </dependency>

    AsertJ 을 선택한 가장 큰이유는 메소드 체이닝을 지원하기 떄문이다. 


    Junit
     assertEquals("Mockito rocks", result);

    AssertJ


       assertThat("Hello, world! Nice to meet you.") // 주어진 "Hello, world! Nice to meet you."라는 문자열은
    .isNotEmpty() // 비어있지 않고
    .contains("Nice") // "Nice"를 포함하고
    .contains("world") // "world"도 포함하고
    .doesNotContain("ZZZ") // "ZZZ"는 포함하지 않으며
    .startsWith("Hell") // "Hell"로 시작하고
    .endsWith("u.") // "u."로 끝나며
    .isEqualTo("Hello, world! Nice to meet you."); // "Hello, world! Nice to meet you."과 일치합니다.


    Junit 소스코를 계속 저런식으로 assert를 추가추가추가추가 .... 반복되는 형식이지만 AssertJ 를 사용할경우 한가지 경우에 대해서 체이닝이 되기 떄문에 명시적으로 여러가지 조건을 연속적으로 표현하기 좋다. 


    그리고 가장좋았던건 내가 필요하다 싶은건 다 이미 다 만들어져 있다. Junit 으로 할경우 뭔가 조합해서 만들어야 하는 케이스 일때 Assertj 는 이미 그 조건들이 구성 되있어서 그냥 사용하면된다. !


    반응형

    'Java > TDD' 카테고리의 다른 글

    TDD ( Junit4 + Mokito + AssertJ ) 겉핥기 3  (0) 2019.01.29
    TDD ( Junit4 + Mokito + AssertJ ) 겉핥기 1  (0) 2019.01.29
Designed by Tistory.