-
TDD ( Junit4 + Mokito + AssertJ ) 겉핥기 2Java/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