2017-10-17 16 views
0

당신은 목록의 내용을 주장하기 위해 다음을 수행 할 수 있습니다AssertJ를 사용하면 목록의 내용에 대해 복잡한 어설 션을 수행하는 방법은 무엇입니까? AssertJ에서

assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob"); 
나는 종종 앨리스는 키가 큰 갈색 머리와 밥이라고 주장, 자신이 예를 들어, 요소 자체에 더 복잡한 주장을하고자 찾아

작고 대머리 다. AssertJ를 사용하여이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

내 자신의 솔루션을하는 것입니다 :

assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob"); 
list.stream() 
    .filter(person -> "Alice".equals(person.getName())) 
    .forEach(alice -> { 
     assertThat(alice).extracting("size").isEqualTo("tall") 
     assertThat(alice).extracting("hair").isEqualTo("brunette") 
    }); 
list.stream() 
    .filter(person -> "Bob".equals(person.getName())) 
    .forEach(bob -> { 
     assertThat(bob).extracting("size").isEqualTo("tiny") 
     assertThat(bob).extracting("hair").isNull() 
    }); 

또는 동등 (자바 7) :

assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob"); 
for(Person person : list){ 
    switch (testCase.getName()){ 
     case "Alice": 
      assertThat(person).extracting("size").isEqualTo("tall") 
      assertThat(person).extracting("hair").isEqualTo("brunette") 
      break; 
     case "Bob": 
      assertThat(person).extracting("size").isEqualTo("tiny") 
      assertThat(person).extracting("hair").isNull() 
      break; 
    } 
} 

하지만 더 나은 솔루션이 있다면 궁금하고있다.

이 솔루션은 예상되는 요소가 목록에 있고 요소 자체가 정확하다는 점을 좋아합니다.

assertThat(list).containsOnlyElementsOf(Arrays.asList(
    new Person("Alice", "tall", "brunette"), 
    new Person("Bob", "tiny", null) 
) 
+0

을 도움이되기를 바랍니다. 나는 클래스가 콜렉션을 포함 할 때 주로이 복잡한 어설 션에 대한 필요성에 부 닥치고이 내부 콜렉션에 대한 단언도하고 싶다. – neXus

답변

2

필터링의 경우, 직접 내가 직접 말할 때 다음 중 하나 allMatch 또는 allSatisfy (I가 필요 의미하지, filteredOn의 맛을 사용할 수 있습니다

0

종종 나는 그것이 단지 전체 예상 모음을 표현하기 위해 쉽게 찾을 수 있습니다 컬렉션을 스트리밍하여 필터링 할 수 있습니다.)

난 당신이 anySatisfy 같은 다른 주장을하거나 are, areAtLeast 같은 방법으로 conditions을 사용하여, AssertJ의 API를 탐험하는 것이 좋습니다 ...이 API의 대부분은 그것을 사용하는 방법을 보여주는 예제와 함께 자바 독을 가지고있다.

또한 assertj-examples 프로젝트에서 examples을 볼 수 있습니다.

는 이것은 매우 단순화 된 예입니다

+0

요소 어설 션이 단순한 경우에만 작동합니다. 답안에서'Person'의'equals' 메쏘드는 올바르게 구현되어야하고 여러분이 원하는 모든 값을 고려해야합니다. 나는 이것을 너무 제한적이라고 본다. 때때로 나는 다른 분야에 관심이 없다. 예를 들어 신발에 신발 크기를 추가 할 수 있습니다.이 크기는 equals 메서드에서 고려해야하지만 테스트에서는 걱정하지 않아도됩니다. – neXus

0
@Test 
public void test(){ 
    assertThat(list).filteredOn(person -> person.getName().equals("Alice")).extracting("size").first().isEqualTo("tall"); 
    assertThat(list).filteredOn(person -> person.getName().equals("Alice")).extracting("hair").first().isEqualTo("brunette"); 
    assertThat(list).filteredOn(person -> person.getName().equals("Bob")).extracting("size").first().isEqualTo("tiny"); 
    assertThat(list).filteredOn(person -> person.getName().equals("Bob")).extracting("hair").first().isNull(); 
}