14

私のAndroidアプリケーションには、URLを表示する意図を実行する簡単な方法があります。

protected void launchBrowser(int id)
{
    Uri uri = Uri.parse( getString( id ) );
    Intent intent = new Intent( ACTION_VIEW, uri);

    PackageManager packageManager = getPackageManager();
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    if (activities.size() > 0)
    {
        startActivity(intent);
    }
    else
    {
        Toast.makeText(getApplicationContext(),
                       "ERROR - no application to display a web page",
                       Toast.LENGTH_SHORT).show();
    }
}

ユニットテストにRobolectricを使用していますが、このメソッドの検証に問題があります。具体的には、getPackageManager()は常にnullを返します。どうすればシャドウイングできPackageManagerますか?を作成しShadowPackageManagerて呼び出してみましたbindShadowClassが、コードが実行されません-getPackageManager()常に。を返しますnull。また、アプリケーションコンテキストをシャドウイングして具象を返そうとしましStubPackageManagerたが、同じ結果が得られました。たぶん私はあまりにも長い間検索/凝視してきました-この方法をユニットテストするためのより良い方法はありますか?

4

6 に答える 6

9

これにはRobolectric 2.3を使用しています。他の回答で述べたように、getPackageManager()null は返されませんが、shadowApplication.setPackageManager存在しなくなりました。

をモックPackageManagerできないため、解決するリストを与えることはできませんIntents。幸いなことに、Robolectric のPackageManagerサブクラス をRobolectricPackageManager使用すると、モックなしでこれらのインテントを追加できます。

RobolectricPackageManager rpm = (RobolectricPackageManager)Robolectric.application.getPackageManager();
rpm.addResolveInfoForIntent(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS), new ResolveInfo());
于 2014-06-15T21:18:56.730 に答える
7

何らかの理由で、アプリケーションでシャドウパッケージマネージャーを手動で設定する必要があります。(RobolectricTestRunnerを拡張して)カスタムテストランナーを作成し、setApplicationStateメソッドをオーバーライドします。

public class MyTestRunner extends RobolectricTestRunner {   
  @Override
  public void setupApplicationstate(RobolectricConfig robolectricConfig) {
     super.setupApplicationState(robolectricConfig);
     ShadowApplication shadowApplication = shadowOf(Robolectric.application);
     shadowApplication.setPackageName(robolectricConfig.getPackageName());
     shadowApplication.setPackageManager(new RobolectricPackageManager(Robolectric.application, robolectricConfig));
  }
}

次に、独自のテストランナーを使用することをテストで指定します。

@RunWith(MyTestRunner.class)
public class MyTest { ... }
于 2012-10-17T00:20:22.540 に答える
3

aleph_nullの回答に追加するだけで、すぐに使用できるShadowResolveInfo.newResolveInfo()モックをすばやく作成できますResolveInfo(私は Robolectric 2.4 を使用しています)。

RobolectricPackageManager rpm = (RobolectricPackageManager)Robolectric.application.getPackageManager();
rpm.addResolveInfoForIntent(new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS), ShadowResolveInfo.newResolveInfo(...));
于 2015-01-31T17:15:32.213 に答える
1

Robolectric 3.1の場合、次のことができます

RobolectricPackageManager packageManager = RuntimeEnvironment.getRobolectricPackageManager();
// add necessary logic here
于 2016-11-17T13:55:22.823 に答える