カスタム ウィジェットをプロジェクトに統合しています。カスタム属性を使用しており、Robolectric をクラッシュさせています。私が収集したところによると、カスタム属性はまだサポートされていません。注: コンストラクターは、構築時に例外をスローするため「敵対的」ですが、今のところコメントアウトしています。
クラッシュログ
java.lang.RuntimeException: com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:106) で com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:82) でのレイアウト/メインの膨張エラーcom.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:86) で com.xtremelabs.robolectric.res.ResourceLoader.inflateView(ResourceLoader.java:377) で com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate( ShadowLayoutInflater.java:43) で com.xtremelabs.robolectric.shadows.ShadowLayoutInflater.inflate(ShadowLayoutInflater.java:48) で android.view.LayoutInflater.inflate(LayoutInflater.java) で com.xtremelabs.robolectric.shadows.ShadowActivity.setContentView (ShadowActivity.java:101) com.blah.MainActivity の android.app.Activity.setContentView(Activity.java) で。org.junit.internal の com.blah.MainActivityTest.setUp(MainActivityTest.java:29) の onCreate(MainActivity.java:17) org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.ジャワ:27)internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
原因: java.lang.ClassCastException: com.blah.support.shadows.ShadowMultiDirectionSlidingDrawer は、com.xtremelabs.robolectric.Robolectric.shadowOf(Robolectric.java:857) で com.xtremelabs.robolectric.shadows.ShadowView にキャストできません。 .xtremelabs.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:70) で android.view.ViewGroup.addView(ViewGroup.java) で com.xtremelabs.robolectric.shadows.ShadowViewGroup.addView(ShadowViewGroup.java:60) でcom.xtremelabs.robolectric.res.ViewLoader$ViewNode.addToParent(ViewLoader.java:217) の android.view.ViewGroup.addView(ViewGroup.java) com.xtremelabs.robolectric.res.ViewLoader$ViewNode.create(ViewLoader. java:180) com.xtremelabs.robolectric.res.ViewLoader$ViewNode.inflate(ViewLoader.java:150) で com.xtremelabs.robolectric.res.ViewLoader$ViewNode.inflate(ViewLoader.java:153) at com.xtremelabs.robolectric.res.ViewLoader.inflateView(ViewLoader.java:102) ... 29 もっと見る
このウィジェットのテストはあまり気にしないので、この問題を回避しようとしています。基本的に、テストがクラッシュしないようにし、ビュー要素が画面に表示されていることを確認したいと考えています。
誰かがJavaファイルをAndroidパッケージに配置するハックを提案しましたが、それが私の場合に当てはまるかどうかはわかりません. この回答で示唆されているように、カスタム ウィジェットは、私の com.blah 構造と並行するパッケージ「android」に存在します。
敵意の問題を回避するために、ウィジェットの影を作成しました (ただし、現在は、例外のスローをコメントアウトしているだけです)。Robolectric が正しく報告しない属性に依存しているため、コンストラクターで行われていた作業をバイパスしたかったのです。シャドウ コンストラクターが呼び出されますが、通常のコンストラクターの実行を続行します。追加の建設を回避する方法はありますか?
ShadowClass
@Implements (MultiDirectionSlidingDrawer.class)
public class ShadowMultiDirectionSlidingDrawer
{
public void __constructor__( Context context, AttributeSet attrs )
{
}
public void __constructor__( Context context, AttributeSet attrs, int defStyle )
{
}
}
カスタム テスト ランナー
public class CustomTestRunner extends RobolectricTestRunner
{
public CustomTestRunner( Class<?> testClass ) throws InitializationError
{
super( testClass );
addClassOrPackageToInstrument("android");
}
@Override
protected void bindShadowClasses()
{
super.bindShadowClasses();
Robolectric.bindShadowClass( ShadowMultiDirectionSlidingDrawer.class );
}
}
テスト フレームワークがこれをサポートするまで、これはクラッシュを回避するための正しいアプローチですか? 私は私の影に何か間違ったことをしていますか、それとも何か他のものを見逃していますか?