4

次のように、エクストラから pojo を取得するアクティビティがあります。

@Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Bundle extras = getIntent().getExtras();
        if (extras != null)
        {
            MyPojo pojo = extras.getParcelable("pojo");
            // do stuff with my pojo here
            }
        }
        // button that shows a toast message
    }

Robolectric を使用してこれをテストするのに苦労しています。ShadowIntents と ShadowActivities の組み合わせを使用する必要があると思いますが、ドキュメントは少し薄く、この特定のシナリオに関する有用なチュートリアルはかなりまばらです。

これは私がこれまでに思いついたものです:

@Test
    public void assertClickingTagSightingDisplaysToast()
    {
        myActivity = new MyActivity();
        myActivity.onCreate(null);
        ShadowActivity shadowMyActivity = shadowOf(myActivity);
        shadowMyActivity.setIntent(new Intent().putExtra("pojo", generateAPojo()));


        ShadowButton shadowButton = (ShadowButton) shadowOf(shadowMyActivity.findViewById(R.id.myButton));
        shadowButton.performClick();

        assertThat(ShadowToast.getTextOfLatestToast(), equalTo("Button was clicked!"));
    }

これらのテストを実行すると、null ポインターが返され続けます。アクティビティのgetIntent().getExtras()行で、インテントを使用してアクティビティをモックするプロセスが正しくないと想定しています。

誰でも助けてもらえますか?

ありがとう

4

1 に答える 1

5

私は自分でこれを打ちました。onCreate() を呼び出す前に、shadowActivity を使用してインテントを操作する必要があるようです。

Robolectric.shadowOf(activity).setIntent(intent);

アクティビティ自体を操作することでうまくいくように思えますが、そうではありません。私よりずっと頭のいい誰かが、これがなぜなのかを説明しなければならないでしょう。

-- 簡単なメモ。Robolectric は javassist を使用してシャドウ クラスを操作しているように見えるため、クラスを最初にロードする前にクラス バインディングを行うことが重要です。ランナーでバインディングを行うという彼らの提案に従いました。

于 2012-06-04T14:55:00.143 に答える