首页 > 解决方案 > 列表的 Hamcrest 匹配器>

问题描述

我正在尝试为返回的方法编写 JUnit 测试

List<Set<String>> result = build(List<Account> accounts, List<Order> orders);

我可以检查我是否有预期的条目数

assertThat(result, hasSize(2));

但是我很难找到关于如何编写断言列表包含一个设置大小为 2 的条目和一个设置大小为 4 的条目的明确文档。如果有人可以指出我需要的相关文档阅读,我将不胜感激

标签: junithamcrest

解决方案


我不记得 Hamcrest 对这个特定的设置有任何东西。

我只会测试其中一组的大小,然后确保总和为 6

使用来自hamcrest.org的 hamcrest-2.2.jar并且在第 3 次失败,因为我故意将其创建为失败,预期值为 5。测试报告设置为 6 时没有失败:JUnit4assertThat

import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.Test;

import java.util.List;
import java.util.Set;

public class MyListTest {

  @Test
  public void listSize() {
    MyList tester = new MyList();
    List<Set<String>> result = tester.generate();

    // assert statements
    assertThat(result, hasSize(2));                                        // yours
    assertThat(result.get(0), anyOf(hasSize(2), hasSize(4)));              // is either 2 or 4
    assertThat((result.get(0).size() + result.get(1).size()), equalTo(5)); // sum must be 6. FAILS with 5 :)
  }
}

测试类:

import java.util.List;
import java.util.Set;

public class MyList {
  public List<Set<String>> generate() {
    Set<String> s1 = Set.of("Hello", "World");
    Set<String> s2 = Set.of("Testing", "One", "Two", "Three");
    return List.of(s1,s2);
  }
}

推荐阅读