10

カスタム ウィジェットをプロジェクトに統合しています。カスタム属性を使用しており、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 );
    }
}

テスト フレームワークがこれをサポートするまで、これはクラッシュを回避するための正しいアプローチですか? 私は私の影に何か間違ったことをしていますか、それとも何か他のものを見逃していますか?

4

1 に答える 1

4

だから私はこれを簡単な方法で解決しました。ビューを main.xml の一部としてインフレートする代わりに、別のレイアウト ファイルに配置しました。アクティビティのコンストラクターで、保護された関数でレイアウトを膨らませました。私のテストクラスでは、テスト対象のクラスを拡張し、ビュー要素を膨らませる代わりに、ブール値を使用して関数が呼び出されたことを追跡しました。

MainActivity.java

public class MainActivity extends FragmentActivity
{
    @Override
    public void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.main );
        addOptionsShade();
    }

    protected void addOptionsShade()
    {
        ViewGroup viewGroup = (ViewGroup) findViewById( R.id.main_view );
        View view = getLayoutInflater().inflate( R.layout.options_shade, null );
        viewGroup.addView( view );
    }
}

MainActivityTest.java

@Test
public void shouldHaveOptionsShade() throws Exception
{
    assertTrue( mainActivity.hostileLibraryWasCalled );
}

class TestMainActivity extends MainActivity
{
    boolean hostileLibraryWasCalled = false;

    @Override
    protected void addOptionsShade()
    {
        hostileLibraryWasCalled = true;
    }
}

シャドウクラスとバインディングを削除し、ライブラリを適切な場所に戻しました(Androidパッケージではありません)。

于 2012-07-30T15:23:32.723 に答える