2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

JUnit에서 assertThat을 사용하는 방법은?

_____
Q1: JUnit에서 `assertThat`이란 무엇인가요?
A1: `assertThat`은 JUnit과 Hamcrest 라이브러리에서 제공하는 메서드로, 테스트 조건을 보다 가독성 좋고 표현력 있게 작성할 수 있도록 도와줍니다. 일반적인 `assertEquals`보다 유연한 매처(matcher)를 사용해 다양한 비교를 할 수 있습니다.

---

Q2: `assertThat`을 사용하려면 어떤 라이브러리를 추가해야 하나요?
A2: JUnit 4.x 버전과 함께 사용할 때는 `org.hamcrest` 라이브러리를 함께 추가해야 합니다. JUnit 5 (Jupiter)에서는 기본적으로 Hamcrest 매처가 포함되어 있지 않으므로 별도로 `org.hamcrest:hamcrest` 라이브러리를 의존성에 추가해야 합니다.

예: Maven `pom.xml`
```xml

org.hamcrest
hamcrest
2.2
test

```

---

Q3: 기본적인 `assertThat` 사용법은 어떻게 되나요?
A3: 아래 형식으로 사용합니다.
```java
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

assertThat(actualValue, is(expectedValue));
```
`assertThat`의 첫 번째 인자는 실제(actual) 값이고, 두 번째 인자는 Matcher 객체입니다.

---

Q4: 자주 사용하는 Hamcrest 매처(Matcher) 예시는 무엇인가요?
A4:
- `is(value)` : 값이 동일한지 비교
- `equalTo(value)` : is와 유사, 값 같음 검사
- `not(value)` : 값이 아닌 경우
- `nullValue()` : null인지 검사
- `notNullValue()` : null이 아님을 검사
- `containsString(substring)` : 문자열에 부분 문자열 포함 여부
- `hasSize(n)` : 컬렉션 크기 검사
- `contains(...)` : 컬렉션의 요소 포함 검사

예:
```java
assertThat("Hello World", containsString("World"));
assertThat(list, hasSize(3));
```

---

Q5: JUnit 5에서 `assertThat`을 쓰려면 어떻게 해야 하나요?
A5: JUnit 5에서는 기본적으로 Hamcrest가 포함되어 있지 않으므로, 별도로 Hamcrest 의존성을 추가해야 하며, import 문은 다음과 같이 사용합니다.
```java
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

assertThat(actual, is(expected));
```

JUnit 5 자체의 assertion과 혼용할 수 있습니다.

---

Q6: `assertThat`과 `Assertions.assertEquals`의 차이는 무엇인가요?
A6:
- `assertEquals`는 단순히 두 값이 같은지 비교합니다.
- `assertThat`은 Hamcrest 매처를 사용해 조건을 세밀하게 제어하고, 실패 시 메시지가 더 직관적이며 표현력이 좋습니다.

예를 들어:
```java
assertEquals("abc", actual);
assertThat(actual, is("abc"));
assertThat(actual, startsWith("a"));
```

---

Q7: `assertThat` 실패 시 메시지는 어떻게 작성하나요?
A7: `assertThat`은 매처가 실패했을 때 자동으로 직관적인 메시지를 제공합니다. 별도의 메시지 작성도 가능하지만, 보통 매처가 충분히 설명적입니다.

직접 메시지를 넣고 싶을 경우:
```java
assertThat("검사 실패", actual, is(expected));
```

---

Q8: 문자열에 대해 대소문자를 무시하고 비교하고 싶다면?
A8: Hamcrest에 기본 매처가 없으므로, 다음처럼 커스텀 매처를 만들거나 `toLowerCase()` 등을 활용할 수 있습니다.
```java
assertThat(actual.toLowerCase(), is(expected.toLowerCase()));
```

---

Q9: `assertThat`을 컬렉션에 사용하는 예시는?
A9:
```java
import static org.hamcrest.Matchers.*;

List list = Arrays.asList("apple", "banana", "cherry");

assertThat(list, hasSize(3));
assertThat(list, hasItem("banana"));
assertThat(list, contains("apple", "banana", "cherry")); // 순서까지 검사
assertThat(list, containsInAnyOrder("cherry", "banana", "apple")); // 순서 무시
```

---

Q10: 자바 8 이상의 람다 표현식과 결합해서 사용할 수 있나요?
A10: 네, Predicate 기반 매처와 함께 커스텀 매처를 만들어 활용할 수 있습니다. 공식 Hamcrest는 일부 람다와도 호환됩니다.

예:
```java
assertThat(number, greaterThan(10));
```

---

요약하면, `assertThat`은 JUnit 테스트에서 조건 검증을 더욱 유연하고 읽기 쉬운 방식으로 도와주는 Hamcrest 기반의 assertion 메서드입니다. 사용 전 라이브러리 의존성을 추가하고 적절한 매처와 함께 활용하면 효과적입니다.
JUnit에서 `assertThat` 메소드는 더 읽기 쉽고 표현력 있는 테스트 검증을 작성하기 위해 사용됩니다.

`assertThat`은 주로 Hamcrest 매처(Matcher) 라이브러리와 함께 사용되어, 객체의 상태나 값이 기대한 조건과 일치하는지 직관적으로 검사할 수 있게 도와줍니다.

기본 개념 - `assertThat`은 두 개의 인자를 받습니다.

1. 실제 값(actual value)

2. 기대 조건을 나타내는 Matcher 객체 형식은 다음과 같습니다.

```java assertThat(actualValue, matcher); ``` - `actualValue`는 테스트하고자 하는 값입니다.

- `matcher`는 Hamcrest에서 제공하는 다양한 조건 중 하나로, 값이 어떤 상태인지 판단하는 역할을 합니다.

준비 사항 1. JUnit

4.4 이상에서는 `assertThat` 메소드가 기본적으로 포함되어 있습니다.



2. 대부분의 경우, 추가로 Hamcrest 라이브러리를 의존성에 포함시켜야 합니다.

- JUnit 5 (JUnit Jupiter)에서는 `org.hamcrest` 라이브러리를 별도로 추가하고 `org.hamcrest.MatcherAssert.assertThat`를 사용합니다.



3. import 구문 예: ```java import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; ``` 또는 JUnit 4에서는 ```java import static org.junit.Assert.assertThat; import static org.hamcrest.Matchers.*; ``` 주요 Hamcrest 매처 예시 - `is(value)` : 값이 기대값과 일치하는지 확인 - `equalTo(value)` : `is`와 유사하게 동작 - `not(value)` : 값이 기대값과 다름을 확인 - `nullValue()` : null 인지 확인 - `notNullValue()` : null이 아님을 확인 - `containsString(substring)` : 문자열이 특정 부분 문자열을 포함하는지 확인 - `hasItem(item)` : 컬렉션이 특정 아이템을 포함하는지 확인 - `greaterThan(value)`, `lessThan(value)` : 크기 비교 - 여러 매처를 조합할 수 있는 `allOf(...)`, `anyOf(...)` 등. 사용 예 ```java import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; public class ExampleTest { @Test public void testString() { String actual = "Hello World"; // 문자열이 "Hello World"와 같은지 확인 assertThat(actual, is("Hello World")); // 문자열에 "World" 포함 여부 확인 assertThat(actual, containsString("World")); // null이 아님 확인 assertThat(actual, notNullValue()); } @Test public void testNumber() { int num = 10; // num이 5보다 큼 확인 assertThat(num, greaterThan(

5)); // num이 20보다 작음 확인 assertThat(num, lessThan(20)); } @Test public void testCollection() { List items = Arrays.asList("apple", "banana", "cherry"); // 리스트에 "banana" 포함 여부 확인 assertThat(items, hasItem("banana")); // 모든 아이템이 문자열인지 확인 assertThat(items, everyItem(instanceOf(String.class))); } } ``` 요약 - `assertThat`은 테스트 값과 기대 조건을 Matcher를 통해 표현하여 더 직관적이고 의미 있는 테스트 코드를 작성할 수 있게 한다.

- Hamcrest 매처를 잘 활용하면 다양한 복합 조건도 쉽게 표현 가능.

- JUnit 4에서는 기본 제공, JUnit 5에서는 Hamcrest를 별도로 추가하여 사용. 이처럼 JUnit에서 `assertThat`과 Hamcrest 매처를 적절히 사용하면 테스트 실패 시 어떤 조건이 실패했는지 명확히 알 수 있고, 가독성 높은 테스트 코드를 작성할 수 있습니다.

작성자: 최민수 [비회원] | 작성일자: 1년 전 2025-05-26 02:50:39
조회수: 172 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.