[java] AssertJ assertThat에 사용자 지정 메시지를 추가 할 수 있습니까?
Hamcrest 매처와 함께 JUnit 어설 션을 주로 사용하는 테스트 스위트가 있습니다. 우리 팀 중 한 명이 AssertJ로 실험을 시작했고 구문, 유연성 및 선언 성으로 사람들에게 깊은 인상을주었습니다. AssertJ에서 이에 상응하는 것을 찾을 수없는 JUnit이 제공하는 한 가지 기능이 있습니다. 사용자 지정 어설 션 실패 메시지 추가입니다.
우리는 종종 인간의 가독성을 위해 만들어지지 않았고 무작위로 보이는 Id 또는 UUID가있는 개체를 비교하고 있으며 포함 된 데이터로 무엇인지 알 수 없습니다. 슬프게도, 그것이 무엇인지 반드시 이해하지 않고 다른 서비스 간의 데이터를 매핑하는 것이 목적의 일부이기 때문에 이것은 우리 코드베이스에서 피할 수없는 상황입니다.
JUnit에서 assertThat
메소드는 String reason
매개 변수 앞에 매개 변수가 있는 버전을 제공합니다 Matcher<T>
. 이것은 비교가 인간에게 어떤 의미를 가져야하는지와 같이 문제에 대한 약간의 빛을 비추는 짧은 디버그 문자열을 추가하는 것을 간단하게 만듭니다.
반면에 AssertJ 는 인터페이스 Assert 또는 여러 구현 클래스 중 하나 를 반환 하는 수많은 제네릭 화 된static assertThat
메서드를 제공합니다 . 이 인터페이스는 실패에 포함될 사용자 정의 메시지를 설정하는 표준 방법을 제공하지 않습니다.
메시지를 추가하려는 모든 어설 션 유형에 대해 사용자 지정 어설 션 클래스 를 만들지 않고도 AssertJ API 또는 해당 확장 중 하나에서이 기능을 얻을 수있는 방법이 있습니까?
답변
그리고 고전적인 방식으로 질문을 게시 한 직후 내가 찾고 있던 것을 발견했습니다. 바라건대 이것은 다음 사람이 먼저 그것이 무엇인지 알지 않고도 쉽게 찾을 수 있도록 할 것입니다. 매직 메서드는 속이는 짧은 이름으로 as
, 기본 Assert 인터페이스가 아닌 Descriptable 을 AbstractAssert
구현 하는 다른 인터페이스의 일부입니다 .
public S as(String description, Object... args)
String.format(String, Object...)
구문을 지원하는이 개체의 설명을 설정 합니다.
예 :
try { // set a bad age to Mr Frodo which is really 33 years old. frodo.setAge(50); // you can specify a test description with as() method or describedAs(), it supports String format args assertThat(frodo.getAge()).as("check %s's age", frodo.getName()).isEqualTo(33); } catch (AssertionError e) { assertThat(e).hasMessage("[check Frodo's age] expected:<[33]> but was:<[50]>"); }
catch 블록에서 인용 된 문자열 hasMessage
은 어설 션이 실패 할 경우 단위 테스트 출력 로그에 표시됩니다.
질문에 연결된 사용자 지정 어설 션 페이지 의 failWithMessage
도우미를 확인하여 이것을 발견했습니다 . 의 JavaDoc 그 방법은 사용자 정의 메시지를 설정하는 호출자가 사용할 수 있도록이 보호된다는 지적한다. 그러나 도우미에 대해 언급합니다 .as
또한이 메서드
as(String, Object...)
는 사용자가 정의한 오류 메시지 또는overridingErrorMessage(String, Object...)
.
… 그리고 표준 AssertJ 메시지를 제공된 새 문자열로 완전히 대체 하는 overridingErrorMessage 도우미 expected: ... but was:...
.
AssertJ 홈페이지는 기능이 강조 표시 될 때까지 두 도우미를 언급하지 않습니다.이 페이지 as
는 Soft Assertions 섹션 에서 도우미의 예를 보여 주지만 그 기능을 직접 설명하지는 않습니다.
답변
Patrick M의 답변에 다른 옵션을 추가하려면 다음을 수행하십시오.
를 사용하는 대신 Descriptable.as
다음을 사용할 수도 있습니다 AbstractAssert.withFailMessage()
.
try {
// set a bad age to Mr Frodo which is really 33 years old.
frodo.setAge(50);
// you can specify a test description via withFailMessage(), supports String format args
assertThat(frodo.getAge()).
withFailMessage("Frodo's age is wrong: %s years, difference %s years",
frodo.getAge(), frodo.getAge()-33).
isEqualTo(33);
} catch (AssertionError e) {
assertThat(e).hasMessage("Frodo's age is wrong: 50 years, difference 17 years");
}
사용하는 것과 다른 Descriptable.as
점은 사용자 지정 메시지 를 완벽하게 제어 할 수 있다는 것입니다. “예상”과 “그러나”가 없습니다.
이는 테스트중인 실제 값이 표시에 유용하지 않은 경우 유용합니다.이 방법을 사용하면 계산 된 다른 값을 대신 표시하거나 전혀 표시하지 않을 수 있습니다.
와 마찬가지로 실제 어설 션 보다Descriptable.as
먼저 호출해야합니다. 그렇지 않으면 어설 션이 먼저 실행되므로 작동하지 않습니다. 이것은 Javadoc에 명시되어 있습니다.withFailMessage()
답변
참고로 이것은 새로운 AssertJ 웹 사이트에 문서화되어 있습니다 . https://assertj.github.io/doc/#assertj-core-assertion-description을 참조 하십시오 .
답변
as()
AssertJ 에서 내장 방법을 사용하십시오 . 예를 들면 :
assertThat(myTest).as("The test microservice is not active").isEqualTo("active");