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?
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).
Tags und Links android unit-testing robolectric