2017-08-09 4 views
1

mit JUnit 4.12 und Android Studio Ich versuche unter Methode zu testen Wo Ergebnisse scheint, ich weiß nicht, werden passende warum als reesult Ich erhalte java.lang.AssertionErrorJUnit AssertionError beim Testen Simple

Methode im Test:

public String dateNow() { 
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy_hh-mm-ss"); 
    String date = sdf.format(new Date()); 
    return date; 
} 

Meine Testklasse:

private Addons mAddons; 

@Before 
public void setUp() throws Exception{ 
    mAddons = new Addons(); 
} 

@Test 
public void testDateNow() throws Exception { 

    final String reality = mAddons.dateNow().substring(0,10); 
    final String expected = "09-08-2017"; 
    assertSame("testDateNow() :", expected, reality); 
} 

Konsolenausgabe:

java.lang.AssertionError: testDateNow() : expected same:<09-08-2017> was not:<09-08-2017> 

Expected :09-08-2017 
Actual :09-08-2017 

Ich weiß nicht, warum es versagt. Würde jemand so König sein, um mir bitte in die richtige Richtung zu zeigen?

+0

off-topic: Der feste String sollte die erwarteten und der resultierende String sollte die real sein werden. – Egl

+0

@Egl - das ist sehr wahr. Danke, dass du es aufgezeigt hast. Das ist meine erste Testklasse überhaupt. – cheeroke

Antwort

1

assertSame überprüft, ob die beiden Parameter das gleiche Objekt sind. Und sie sind nicht.

Wenn Sie prüfen möchten, ob sie den gleichen Inhalt haben, sollten Sie assertEquals stattdessen verwenden.

+0

gerettet mein Tag, danke. – cheeroke

1

Die toString() Methoden der beiden Termine drucken die gleiche Sache, aber die Objekte, die sie sich beziehen könnte anders sein.

1

Während Ihre Logik korrekt ist, verwenden Sie die falsche Behauptung in Ihrem Test. Die documentation for assertSame sagt, dass es behauptet, dass die beiden Objekte sich auf dasselbe Objekt beziehen müssen. Dies bedeutet, dass die beiden Objekte auf dasselbe Objekt verweisen müssen.

Wenn Sie reality auf den String "09-08-2017" wird die Variable reality jetzt zuweisen zu einem Objekt beziehen den Wert "09-08-2017" im Speicher enthält.

Die mAddons.dateNow().substring(0,10) erzeugen andere Objekt, mit dem gleichen Wert "09-08-2017", so expected den gleichen Wert hat, aber es ist nicht in dem Speicher auf das gleiche Objekt beziehen.

behaupten, dass die Werte gleich sind, sollten Sie assertEquals verwenden, die für die Wertgleichheit testen, nicht verweisen.

Dies ist ein sehr häufiger Fehler, wenn Strings in Java zu vergleichen.

Ich schlage vor, Sie auch den folgenden Artikel zu lesen: Java String compare

+0

danke für deine Erklärung, das habe ich gemerkt, als @Egl seine Antwort gepostet hat. – cheeroke