2016-05-13 13 views
2

Könnte ich AssertJ irgendwie verwenden, um eine Liste zu behaupten, hat nur eine Instanz einer (Unter) Klasse?Assert Liste enthält nur eine Instanz einer Klasse mit AssertJ

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

, was ist falsch mit Ihrem aktuellen Code? –

+0

AssertJs Methode containsOnlyOnce akzeptiert keine Klasse als Argument. (Es sei denn, die Liste war eine Liste der Klasse.) –

Antwort

1

Sie benötigen ein Condition zu definieren.

Folgendes wird bestätigen, dass list nur eine einzelne Objektreferenz vom Typ B.class enthält.

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

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

Es wird für folgende Fälle fehlschlagen:

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

und auch für

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

die Java-8-Stream-API kann es wie

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

Das Problem mit Ihrem Code ist, dass die Art von list ist A, aber die Art des Elements Sie mit containsOnlyOnce überprüfen mögen, ist Class<B>.

Sie müssen die entsprechenden Typen verwenden. Zum Beispiel können Sie die Klassen in der Liste extrahieren:

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

I erreicht werden würde AssertJverwendenwie:

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

Es gibt ein Verfahren hasOnlyElementsOfType(Class), der überprüft, dass alle Elemente in der Iterable den angegebenen Typen (einschließlich Subklassen des gegebenen Typs) aufweisen.

könnte die Lösung wie folgt aussehen:

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

Willkommen bei Stack Overflow! Während Sie das Problem dieses Benutzers möglicherweise gelöst haben, sind Code-Only-Antworten für Benutzer, die in Zukunft auf diese Frage kommen, nicht sehr hilfreich. Bitte bearbeiten Sie Ihre Antwort, um zu erklären, warum Ihr Code das ursprüngliche Problem löst – Omore

Verwandte Themen