assertEquals(Object, Object)
JUnit4에서 / JUnit을 5 assertThat(actual, is(expected));
Hamcrest에서 단지 모두로 작동 다른 답변에서 제안 equals()
하고 toString()
비교 객체의 클래스 (깊이)에 대한 오버라이드된다.
어설 션의 동등성 테스트 equals()
와 테스트 실패 메시지 toString()
가 비교 된 개체 에 의존하기 때문에 중요 합니다.
들어 내장과 같은 클래스 String
, Integer
등등 ... 이러한 재정 등의 문제없이 모두 equals()
와 toString()
. 그래서 주장 완벽하게 유효 List<String>
또는 List<Integer>
과 assertEquals(Object,Object)
.
그리고이 문제에 대해 : equals()
JUnit 테스트에서 어설 션을 쉽게 만들 수있을뿐만 아니라 객체 평등 측면에서 의미가 있기 때문에 클래스에서 재정의해야합니다 .
어설 션을 쉽게 만들려면 다른 방법이 있습니다.
모범 사례로 어설 션 / 매칭 라이브러리를 선호합니다.
다음은 AssertJ 솔루션입니다.
org.assertj.core.api.ListAssert.containsExactly()
그것은 당신이 필요로하는 것입니다 : 그것은 실제 그룹이 javadoc에 명시된 순서대로 주어진 값을 포함하고 다른 것을 포함하지 않는지 확인합니다.
Foo
요소를 추가하고 얻을 수 있는 클래스를 가정하십시오 . 그에
대한 단위 테스트 Foo
는 두 목록이 동일한 내용을 가지고 있다고 주장합니다.
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add("One", "Two", "Three");
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
}
AssertJ의 좋은 점은 List
예상대로 선언하는 것이 불필요하다는 것입니다. 어설 션이 더 명확 하고 코드를 더 읽기 쉽게 만듭니다.
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
그러나 어설 션 / 매치 라이브러리는 반드시 더 필요하기 때문에 필수입니다.
이제 가정 Foo
하지 않습니다 상점 String
들하지만,이 Bar
인스턴스를이야.
그것은 매우 일반적인 요구입니다. AssertJ를 사용하면 어설 션을 쉽게 작성할 수 있습니다. equals()/hashCode()
JUnit 방식에 다음이 필요하지만 요소 클래스가 재정의되지 않더라도 목록 내용이 동일하다고 주장하는 것이 좋습니다 .
import org.assertj.core.api.Assertions;
import static org.assertj.core.groups.Tuple.tuple;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add(new Bar(1, "One"), new Bar(2, "Two"), new Bar(3, "Three"));
Assertions.assertThat(foo.getElements())
.extracting(Bar::getId, Bar::getName)
.containsExactly(tuple(1, "One"),
tuple(2, "Two"),
tuple(3, "Three"));
}
assertArrayEquals
요즘 사용하고 싶다 . 와 함께 사용하십시오List#toArray
.