반응형

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와 동일하다. 
아래 세문장은 의미가 동일하다.
assertThat(entity, equalTo(expectedEntity));
assertThat(entity, is(equalTo(expectedEntity)));
assertThat(entity, is(expectedEntity));

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
 typeCompatibleWith

동일 인스턴스인지 타입 비교(instance of).
동일하거나 상위 클래스, 인터페이스인지 판별

IsInstanceOf
IsCompatibleType

 notNullValue
 nullValue

Null인지, 아닌지 판별

IsNull

 sameInstance

Object가 완전히 동일한지 비교.
equals 비교가 아닌 ==(주소비교)로 비교하는 것과 동일

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로 판단한다.
Java의 숏서킷(||)과 마찬가지로 한 번이라도 일치하면 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,
hasKey, hasValue

맴(Map)요소에 대한 포함 여부 판단

isMapContaining

 hasItem,
hasItems

특정 요소들을 포함하고 있는지 여부 판단

IsCollectionContaining

 hasItemInArray

배열 내에 찾는 대상이 들어 있는지 여부를 판별

IsArrayContaining

 

 

 

 

 

https://www.lesstif.com/pages/viewpage.action?pageId=18219426

 

 

http://blog.naver.com/PostView.nhn?blogId=simpolor&logNo=221289242597&parentCategoryNo=&categoryNo=166&viewDate=&isShowPopularPosts=false&from=postView

반응형