【问题标题】:Hamcrest matcher for a sublist/partial match?用于子列表/部分匹配的 Hamcrest 匹配器?
【发布时间】:2016-01-04 11:16:06
【问题描述】:

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

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

【问题讨论】:

  • 也许使用 Collections.indexOfSubList ?
  • @dimitrisli 感谢您的建议。我可能会在客户匹配器中使用它。

标签: java hamcrest


【解决方案1】:

如果可以的话,自己写。

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);
      }
}

【讨论】:

  • 这是无效的。有matchesSafely 方法采用单个T,而不是List&lt;T&gt;
【解决方案2】:

我认为没有这种预定义的 Matcher。我在 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);
  }
}

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多