10

AssertJ を使用して、リストに (サブ) クラスのインスタンスが 1 つしかないことをアサートできますか?

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

4 に答える 4

13

AssertJ抽出機能をそのまま使用します。

assertThat(list).extracting("class")
                .containsOnlyOnce(B.class);
于 2016-05-14T09:36:15.877 に答える
5

Conditionを定義する必要があります。

list以下は、 type のオブジェクト参照を 1 つだけ含むassert です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);
于 2016-05-13T10:02:52.573 に答える
3

コードの問題は、の型がlistisAであるが、検証しようとしている要素の型が is であることcontainsOnlyOnceですClass<B>

対応するタイプを使用する必要があります。たとえば、リスト内のクラスを抽出できます。

Stream<Class<?>> classes = list.stream().map(x -> x.getClass());
Assertions.assertThat(classes).containsOnlyOnce(B.class);
于 2016-05-13T09:19:49.450 に答える