2016-06-16 8 views
2

Ich bin derzeit ein bisschen verwirrt über Intent Extras. Ich weiß, dass die so genannten Extras sind ein Bundle und die Bundle ist intern eine Karte.Simple Intent - jUnit-Test schlägt fehl

Und wenn ich etwas in diese Karte mit intent.putExtra("someName", "someValue"); setze, erwarte ich, dass jetzt ein Schlüssel namens "someName" in der Karte vorhanden ist. Aber es ist nicht, nach meinem sehr einfachen Unit-Test.

public void testIntent(){ 
    assertTrue("true != true", true); 
    assertFalse("false != false", false); 

    final String extraName = "IamAnExtra"; 
    final String extraValue = "IamAValue"; 
    Intent intent = new Intent(); 
    intent.putExtra(extraName, extraValue); 

    assertTrue("hasExtra==false", intent.hasExtra(extraName)); 
    } 

Jetzt THS Ergebnisse in der folgenden:

junit.framework.AssertionFailedError: hasExtra==false 

Welche Art von Magie hinter der Intent-Code geschieht? Ich weiß, dass es normalerweise funktioniert. Ist die Karte zwischengespeichert und nur geschrieben, wenn ich die Absicht sende? Vielen Dank im Voraus!

Edit:

Ich habe die Linie assertNotNull("extras == null", intent.getExtras()); die ebenfalls ausfällt.

Und ich überprüft den Code von den Methoden putExtra und getExtras, das ist:

public Intent putExtra(String name, String value) { 
    if (mExtras == null) { 
     mExtras = new Bundle(); 
    } 
    mExtras.putString(name, value); 
    return this; 
    } 

und

public Bundle getExtras() { 
    return (mExtras != null) 
      ? new Bundle(mExtras) 
      : null; 
    } 

Also, wenn die Mitglieds mExtras null ist, wird Null für getExtras zurückgegeben. Aber putExtra erstellt eine neue Bundle-Instanz für mExtras, daher mExtrassollte nicht null sein. Ich bin verwirrt.

+0

Führen Sie es als _unit test_ oder als _instrumented test_? Und welchen Rahmen verwendest du, JUnit 4? – josemigallas

+0

Komponententest. Ich habe einen normalen Testfall benutzt. – JacksOnF1re

+0

Ich habe gedacht, dass die Verwendung einer einfachen Absicht in Ordnung ist, mit einer guten alten Einheit zu verwenden, nicht wahr? Ich werde nicht versuchen, es oder etwas anderes zu senden. – JacksOnF1re

Antwort

1

Das Problem ist, dass Sie versuchen, auf dem Android SDK mit einem normalen Unit Test zu testen. Komponententests in Android sollten nur für die App-Logik verwendet werden, wobei einige spöttische Bibliotheken wie mockito und einfacher Java-Code verwendet werden.

Also müssen Sie entweder diese Absicht vortäuschen oder diesen Test auf einem echten Gerät mit einer Instrumented Test implementieren, Option, die ich sehr empfehlen.

Sie haben die explanation why here.

EDIT:

Diese gradle Flag, das der Eintrag bezieht sich auf:

testOptions { 
     unitTests.returnDefaultValues = true 
    } 

nur der Test erlaubt es ohne Vorwarnung Ausnahme ausgeführt werden soll, aber nicht macht nicht Sie in der Lage das SDK zu verwenden. Wenn Sie das Intent tatsächlich instanziieren, erhalten Sie nichts anderes als eine Nullreferenz. Am Ende kann die Behauptung intent.hasExtra(...) nicht wahr sein.

+0

Danke jose, ich werde jeden Hinweis lesen und es morgen selbst testen und dann die Antwort akzeptieren. – JacksOnF1re