2017-10-17 130 views
0

在AssertJ你可以做以下断言列表的内容:使用AssertJ,我如何对列表的内容执行复杂的断言?

assertThat(list).extracting("name").containsExactlyInAnyOrder("Alice", "Bob"); 

我经常发现自己想要做的元素本身,如更复杂的断言,断言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() 
    }); 

或等价(Java 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; 
    } 
} 

但我想知道是否有更好的解决方案。

我喜欢这个解决方案区分列表中的预期元素和元素本身是正确的。

+0

这是一个高度简化的例子。我主要遇到这种复杂断言的需要,大部分是当一个类包含一个集合时,我也想在这个内部集合上做断言。 – neXus

回答

2

用于过滤,可以直接使用的filteredOn任何味道,那么无论allMatchallSatisfy(当我直接说我的意思是没有必要以流式传输您的收藏,以便对其进行过滤)。

我建议去探索AssertJ API,你还有其他的断言像anySatisfy或使用conditions与法像areareAtLeast,......绝大多数的API与javadoc的例子来说明如何使用它。

此外,可以在assertj-examples项目中查看examples

希望它可以帮助

0

我经常发现它更容易只是表达整个预期的集合:

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

这只适用于元素断言很简单的情况。在你的回答中,'Person'的'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(); 
} 
相关问题