列表内容无序时AssertEquals

Baz*_*Baz 9 java junit hamcrest

如果可以按任何顺序退回产品,您会如何重构以下内容?

List<Product> products = get_products("test_produc");
assertEquals(products.size(),3);
assertEquals(products.get(0).getName(), "test_product1");
assertEquals(products.get(1).getName(), "test_product2");
assertEquals(products.get(2).getName(), "test_produc3");
Run Code Online (Sandbox Code Playgroud)

如果可以使用流优雅地完成,那么我就开始提出这些建议.Hamcrest的建议也很受欢迎.

Thi*_*ler 8

请注意,它assertEquals也适用于Lists和Sets.这更少打字,它会给出非常明确的错误消息.

如果不允许返回值包含重复项,则它们应返回Set而不是List.如果您可以通过这种方式更改正在测试的功能,可以按如下方式进行测试:

assertEquals(new HashSet<>(Arrays.asList("Item1", "Item2")), get_products());
Run Code Online (Sandbox Code Playgroud)

如果这不是一个选项,您应该对预期结果和实际结果进行排序并比较:

asssertEquals(Arrays.sort(Arrays.asList("Item1", "Item2")), Arrays.sort(get_products()));
Run Code Online (Sandbox Code Playgroud)

最后你可以使用Hamcrest匹配器(函数containsInAnyOrderorg.hamcrest.collection.IsIterableContainingInAnyOrder):

assertThat(get_products(), containsInAnyOrder("Item1", "Item2"));
Run Code Online (Sandbox Code Playgroud)


MD *_*med 7

我建议使用AssertJ -

import static org.assertj.core.api.Assertions.assertThat;

// ......

List<String> products = get_products("test_produc").stream()
    .map(Product::getName)
    .collect(toList());

assertThat(products).containsExactlyInAnyOrder("Third", "Second", "First");
Run Code Online (Sandbox Code Playgroud)

此外,它还为您提供了更多流畅的断言(尤其是异常处理断言).