用于子列表/部分匹配的Hamcrest匹配器?

时间:2016-01-04 11:16:06

标签: java hamcrest

假设我有一个实际的List [1,2,3,4],我想检查它是否包含子列表[2,3](即顺序也很重要)。是否有现成的匹配器?

(有一个命名不佳的hasItems方法,只检查实际列表是否与预期列表中的任何一个项匹配....)

2 个答案:

答案 0 :(得分:3)

我认为没有这样的预定义匹配器。我在JUnit上使用AssertJ,所以我可以这样解决这个问题:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.assertj.core.api.Assertions;
import org.junit.Test;

public class TestContains2 {

  @Test
  public void test_contains() {
    List<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
    Assertions
      .assertThat(a)
      .containsSequence(2, 3);
  }
}

答案 1 :(得分:3)

如果可以的话,写下你自己的。

请参阅Writing custom matchers

应该是这样的:

 public class HasSublist<T> extends TypeSafeMatcher<T> {

     @Override
      public boolean matchesSafely(List<T> subList) {
        //Logic if sublist exist ...
        return true;
      }

      public static <T> Matcher<T> hasSubList(List<T> containsSublist) {
        return new HasSublist<T>(containsSublist);
      }
}