hamcrest란?
hamcrest는 JUnit에 사용되는 Matcher 라이브러리이다.
테스트 표현식을 작성할 때 좀 더 문맥적으로 자연스럽고 우아한 문장을 만들 수 있도록 도와준다.
예를들어 assertEquals(expedted, actual)이라는 코드보다 assertThat(expected, is(actual))라는 코드가 훨씬 보기 쉬울 것이다.
* Mactcher 라이브러리 : 필터나 검색등을 위해 값을 비교할 때 좀 더 편리하게 사용하도록 도와주는 라이브러리
hamcrest 패키지
패키지 |
설명 |
org.hamcrest.core |
오브젝트나 값들에 대한 기본적인 Matcher들 |
org.hamcrest.beans |
Java 빈(Bean)과 그 값 비교에 사용되는 Matcher들 |
org.hamcrest.coolection |
배열과 컬렉션 Matcher들 |
org.hamcrest.number |
수 비교를 하기 위한 Matcher들 |
org.hamcrest.object |
오브젝트와 클래스들 비교하는 Matcher들 |
org.hamcrest.test |
문자열 비교 |
org.hamcrest.xml |
XML 문서 비교 |
코어 (Core)
메소드 |
설명 |
클래스 명 |
anything |
어떤 오브젝트가 사용되든 일치한다고 판별한다. |
IsAnything |
describedAs |
테스트 실패 시에 보여줄 추가적인 메시지를 만들어주는 메시지 테코레이터 |
DescribedAs |
equalTo |
두 오브텍트가 동일한지 판별한다. |
IsEqual |
is |
내부적으로 equalTo와 동일하다. |
Is |
package com.example.myapplication;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsNull.notNullValue;
public class MyTest {
// value가 null이니 success
@Test
public void nullTest() {
String value = null;
assertThat(value, is(nullValue()));
}
// value가 null이 아니니 fail
@Test
public void notNullTest() {
String value = null;
assertThat(value, is(notNullValue()));
}
}
java.lang.AssertionError:
Expected: is not null
but: was null
Expected :is not null
Actual :null
<Click to see difference>
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
...
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Process finished with exit code -1
오브젝트 (Object)
메소드 |
설명 |
클래스 명 |
hasToString |
toString 메소드 값과 일치 여부를 판별한다. |
HasToString |
instanceOf |
동일 인스턴스인지 타입 비교(instance of). |
IsInstanceOf |
notNullValue |
Null인지, 아닌지 판별 |
IsNull |
sameInstance |
Object가 완전히 동일한지 비교. |
isSame |
package com.example.myapplication;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.MatcherAssert.assertThat;
public class MyTest {
@Test
public void instanceOfTest() {
Integer value = 1;
// Type을 비교
assertThat(value, instanceOf(Integer.class));
assertThat(value, instanceOf(String.class));
}
}
java.lang.AssertionError:
Expected: an instance of java.lang.String
but: <1> is a java.lang.Integer
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at com.example.myapplication.MyTest.instanceOfTest(MyTest.java:18)
...
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Process finished with exit code -1
논리 (Logical)
메소드 |
설명 |
클래스 명 |
allOf |
비교하는 두 오브젝트가 각각 여러 개의 다른 오브젝트를 포함하고 있을 경우에, 이를테면 collection 같은 오브젝트일 경우 서로 동일한지 판별한다. Java의 숏서킷(&& 비교)과 마찬가지로 한 부분이라도 다른 부분이 나오면 그 순간 false를 돌려준다. |
AllOf |
anyOf |
allOf와 비슷하나 anyOf는 하나라도 일치하는 것이 나오면 true로 판단한다. |
AnyOf |
not |
서로 같지 않아야 한다. |
IsNot |
package com.example.myapplication;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsNot.not;
import static org.hamcrest.core.IsNull.notNullValue;
public class MyTest {
@Test
public void notNullTest() {
String value = null;
// notnull을 기대하지 않는데 null 이므로 성공
assertThat(value, not(notNullValue()));
// notnull을 기대하지 않는데 null 이므로 실패
assertThat(value, notNullValue());
}
}
java.lang.AssertionError:
Expected: not null
but: was null
Expected :not null
Actual :null
<Click to see difference>
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
...
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Process finished with exit code -1
컬렉션 (Collection)
메소드 |
설명 |
클래스 명 |
array |
두 배열 내의 요소가 모두 일치하는지 판별 |
IsArray |
hasEntry, |
맴(Map)요소에 대한 포함 여부 판단 |
isMapContaining |
hasItem, |
특정 요소들을 포함하고 있는지 여부 판단 |
IsCollectionContaining |
hasItemInArray |
배열 내에 찾는 대상이 들어 있는지 여부를 판별 |
IsArrayContaining |
https://www.lesstif.com/pages/viewpage.action?pageId=18219426
'Applied > Unit Test' 카테고리의 다른 글
[JUnit] exception 테스트 하는 방법 (0) | 2020.03.01 |
---|---|
[JUnit] private 메서드, 변수 테스트 방법 (1) | 2020.02.29 |
[JUnit] Suite annotation을 이용한 집합 테스트 (0) | 2020.02.07 |
[JUnit] JUnit Parameterized (0) | 2020.02.06 |
[Espresso] Espresso architecture and workflow (0) | 2020.02.05 |