Wie erstelle ich eine Schattenklasse, um Abstürze im Zusammenhang mit benutzerdefinierten Attributen zu umgehen, wenn ich eine Android-App mit Robolectric teste?

9

Ich integriere ein benutzerdefiniertes Widget in mein Projekt . Es verwendet benutzerdefinierte Attribute und stürzt Robolectric ab. Soweit ich weiß, werden benutzerdefinierte Attribute noch nicht unterstützt . Hinweis: Der Konstruktor ist "feindselig", weil er Ausnahmen bei der Konstruktion auslöst, aber ich habe sie vorerst auskommentiert.

Absturzprotokoll

  

java.lang.RuntimeException: Fehler beim Aufblasen von layout / main       unter com.xtremelabs.robolectric.res.ViewLoader.inflateView (ViewLoader.java:106)       unter com.xtremelabs.robolectric.res.ViewLoader.inflateView (ViewLoader.java:82)       bei com.xtremelabs.brocolectric.res.ViewLoader.inflateView (ViewLoader.java:86)       unter com.xtremelabs.robolectric.res.ResourceLoader.inflateView (ResourceLoader.java:377)       bei com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate (ShadowLayoutInflater.java:43)       bei com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate (ShadowLayoutInflater.java:48)       bei android.view.LayoutInflater.inflates (LayoutInflater.java)       unter com.xtremelabs.robolectric.shadows.ShadowActivity.setContentView (ShadowActivity.java:101)       bei android.app.Activity.setContentView (Activity.java)       bei com.blah.MainActivity.onCreate (MainActivity.java:17)       bei com.blah.MainActivityTest.setUp (MainActivityTest.java:29)       bei org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:44)       bei org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:15)       at org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java:41)       an org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java:27)

     

verursacht durch: java.lang.ClassCastException: com.blah.support.shadows.ShadowMultiDirectionSlidingDrawer kann nicht in com.xtremelabs.robolectric.shadows.ShadowView umgewandelt werden       bei com.xtremelabs.robolectric.Robolectric.shadowOf (Robolectric.java:857)       unter com.xtremelabs.robolectric.shadows.ShadowViewGroup.addView (ShadowViewGroup.java:70)       bei android.view.ViewGroup.addView (ViewGroup.java)       unter com.xtremelabs.robolectric.shadows.ShadowViewGroup.addView (ShadowViewGroup.java:60)       bei android.view.ViewGroup.addView (ViewGroup.java)       bei com.xtremelabs.robolectric.res.ViewLoader $ ViewNode.addToParent (ViewLoader.java:217)       bei com.xtremelabs.robolectric.res.ViewLoader $ ViewNode.create (ViewLoader.java:180)       bei com.xtremelabs.robolectric.res.ViewLoader $ ViewNode.inflate (ViewLoader.java:150)       bei com.xtremelabs.robolectric.res.ViewLoader $ ViewNode.inflate (ViewLoader.java:153)       unter com.xtremelabs.robolectric.res.ViewLoader.inflateView (ViewLoader.java:102)       ... 29 mehr

Ich versuche, dieses Problem zu umgehen, weil es mir nicht so wichtig ist, dieses Widget zu testen. Grundsätzlich möchte ich, dass meine Tests nicht abstürzen und verifizieren, dass das Ansichtselement auf dem Bildschirm erscheint.

Jemand schlug einen Hack vor, der die Java-Datei in eine Android-Paket , aber ich bin mir nicht sicher, ob es in meinem Fall gilt. Wie von dieser Antwort vorgeschlagen, lebt das benutzerdefinierte Widget im Paket "android", das parallel zu meiner com.blah-Struktur ist.

Ich habe einen Schatten des Widgets erstellt, um das Problem der Feindseligkeit zu umgehen (aber ich ziehe gerade das Ausnahmewerfen aus). Ursprünglich wollte ich die Arbeit umgehen, die im Konstruktor ausgeführt wurde, da sie auf Attributen beruht, die Robolectric nicht korrekt meldet. Der Schattenkonstruktor wird aufgerufen, aber er wird durch die normale Konstruktorausführung fortgesetzt. Gibt es eine Möglichkeit, zusätzliche Konstruktion zu umgehen?

Schattenklasse

%Vor%

Benutzerdefinierter Test-Runner

%Vor%

Ist dies der richtige Ansatz, um die Abstürze zu umgehen, bis das Test-Framework dies unterstützt? Mache ich etwas falsch mit meinem Schatten oder vermisse ich etwas anderes?

    
colabug 27.07.2012, 21:18
quelle

1 Antwort

3

Also habe ich das auf einfache Weise gelöst. Anstatt die Ansicht als Teil meiner main.xml zu inflationieren, lege ich sie in eine separate Layoutdatei. Im Konstruktor meiner Activity habe ich das Layout in einer geschützten Funktion aufgepumpt. In meiner Testklasse habe ich die zu testende Klasse erweitert und anstatt das Ansichtselement aufzublasen, habe ich einen Booleschen Befehl verwendet, um die Funktionen als aufgerufen zu bezeichnen.

MainActivity.java

%Vor%

MainActivityTest.java

%Vor%

Ich habe die Schattenklasse entfernt & amp; Bindungen und legen Sie die Bibliothek an einem sinnvollen Ort (nicht im Android-Paket).

    
colabug 30.07.2012, 15:23
quelle