【问题标题】:Assert List contains only one instance of a class using AssertJAssert List 仅包含一个使用 AssertJ 的类的实例
【发布时间】:2016-05-13 09:10:59
【问题描述】:

我能否以某种方式使用 AssertJ 来断言 List 只有一个(子)类的实例?

public class A {}
public class B extends A {}
public class C extends A {}

@Test
public void test() {
  List<A> list = new ArrayList<A>();
  list.add(new B());

  Assertions.assertThat(list).containsOnlyOnce(B.class);
}

【问题讨论】:

  • 你当前的代码有什么问题?
  • AssertJ 的 containsOnlyOnce 方法不接受 Class 作为它的参数。 (除非列表是 Class 列表。)

标签: java unit-testing assertj


【解决方案1】:

有一个方法hasOnlyElementsOfType(Class),它验证Iterable中的所有元素都具有指定的类型(包括给定类型的子类)。

解决方案可能如下所示:

assertThat(list).hasOnlyElementsOfType(B.class).hasSize(1);

【讨论】:

  • 欢迎来到 Stack Overflow!虽然您可能已经解决了这个用户的问题,但纯代码的答案对于将来遇到这个问题的用户来说并不是很有帮助。请编辑您的答案以解释为什么您的代码解决了原始问题
【解决方案2】:

我会按原样使用 AssertJ extracting feature

assertThat(list).extracting("class")
                .containsOnlyOnce(B.class);

【讨论】:

  • 卡斯蒂廖拉这是一个了不起的答案。感谢您的库。
【解决方案3】:

您需要定义一个Condition

以下将断言list 仅包含一个B.class 类型的对象引用。

Condition condition = new Condition() {
    @Override
    public boolean matches(Object o) {
        return o.getClass() == B.class;
    }};

Assertions.assertThat(list).areExactly(1, condition);

以下情况会失败:

list.add(new B());
list.add(new B());

也为

B b = new B();
list.add(b);
list.add(b);

使用 Java 8 Stream API 可以像这样实现

long countOfClassB = list.stream().filter(t -> t instanceof B).count();
Assertions.assertThat(countOfClassB).isEqualTo(1L);

【讨论】:

    【解决方案4】:

    你的代码的问题是list的类型是A, 但是您尝试使用containsOnlyOnce 验证的元素类型是Class&lt;B&gt;

    您需要使用相应的类型。 例如,您可以提取列表中的类:

    Stream<Class<?>> classes = list.stream().map(x -> x.getClass());
    Assertions.assertThat(classes).containsOnlyOnce(B.class);
    

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 2012-01-13
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多