거누의 개발노트
assertThat().extracting().containsExactly() error 본문
반응형
QueryDSL 강의를 듣는 중에 assertThat().extracting().containsExactly() 해당 코드를 작성하면 containsExactly에서 컴파일 에러가 발생한다.
실행 시켜보면 아래와 같은 에러 메시지를 확인 할 수 있다.
java: cannot find symbol
symbol: method containsExactly(java.lang.String,java.lang.String)
location: class org.assertj.core.api.AbstractObjectAssert<capture#1 of ?,capture#2 of ?>
원인을 찾아보자.
이렇게 써보니까 빨간불은 사라졌다.
extracting 메소드가 단일 인자를 받지 못하는 것 같다. 강의에서는 되었었는데, 버전이 바뀌면서 단일개는 못받는 것일까?
@CheckReturnValue
public AbstractListAssert<?, List<?>, Object, ObjectAssert<Object>> extracting(String... propertiesOrFields) {
Tuple values = byName(propertiesOrFields).apply(actual);
String extractedPropertiesOrFieldsDescription = extractedDescriptionOf(propertiesOrFields);
String description = mostRelevantDescription(info.description(), extractedPropertiesOrFieldsDescription);
return newListAssertInstance(values.toList()).withAssertionState(myself).as(description);
}
현재 사용하고 있는 extracting 메소드를 확인해 봤을 땐, String을 여러개 받고 있긴 하다.
assertThat(result).extracting("username");
위 처럼 사용했을 때도 오류가 없어서 어떤 메소드를 사용하고 있는지 확인 해봤다.
@CheckReturnValue
public AbstractObjectAssert<?, ?> extracting(String propertyOrField) {
return super.extracting(propertyOrField, this::newObjectAssert);
}
확실히 단일 인자만 받고 있다. 버전 문제는 아닌듯 하다.
일단 위에 코드로 실행 해본 결과
org.assertj.core.util.introspection.IntrospectionError:
Can't find any field or property with name 'username'.
Error when introspecting properties was :
- No getter for property 'username' in java.util.ArrayList
Error when introspecting fields was :
- Unable to obtain the value of the field <'username'> from <[Member(id=3, username=member1, age=10), Member(id=4, username=member2, age=20)]>
이런 에러가 나온다.
이름이 'username'인 필드나 속성을 찾을 수 없다는 에러인것 같다.
하지만 위 에러에서 username이 보이는데...
https://www.inflearn.com/questions/31792
같은 문제를 겪고 있는 사람이 있었다...
해결 방법은 아래 Assertions를 import 하면 금방 해결이 된다...
import static org.assertj.core.api.Assertions.*;
윽... 아까운 내시간..
반응형
Comments