0

このウェブサイトや他のウェブサイトでこれを見つけようとして 3 日が経ちましたが、本当にあなたの助けが必要です。

クラスのメソッドをテストしたい。このメソッドは、アクティビティ クラス コンテキストを使用してインテントを呼び出します。テストメソッドから呼び出すと、NullPointerException が発生します。これどうやってするの?(サンプルコードを追加してください)。

アクセサリは ActivityClass です。

ドッキング クラスのメソッド:

public boolean powerConnected() {

    boolean res = false;
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    Context cont = Accessories.context;
    Intent intent = cont.registerReceiver(null, filter); --Throws the exception
    int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
    if(plugged == BatteryManager.BATTERY_PLUGGED_AC){
        Log.d(TAG, "AC "+plugged);
        res = true;
    }else if (plugged == BatteryManager.BATTERY_PLUGGED_USB){
        Log.d(TAG, "USB "+plugged);
        res = false;
    }
    return res;
}

テスト方法:

@Test
public void testPowerConnected_AssertParamConnected_ReturnTrue() {
    Docking docking = new Docking();
    boolean result = docking.powerConnected();
    assertTrue(result);
}

どうもありがとう。

4

4 に答える 4

3

コードを屈折させて、コンテキストをパラメーターとしてメソッドに渡すことができます。

public boolean powerConnected(Context cont) {
   ....
}

テストで呼び出すときに、MockContextを使用できるようにします。

class CustomMock extends MockContext {
  Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
    // You can return a MockIntent based on your testing needs.
  }
}

@Test
public void testPowerConnected_AssertParamConnected_ReturnTrue() {
  Docking docking = new Docking();
  MockContext cont = new CustomMock ();

  boolean result = docking.powerConnected(cont);
  assertTrue(result);
}
于 2013-05-29T11:25:04.580 に答える
1

ちょうど解決策を見つけました。

TestClass が AndroidTestCase を拡張し、私のように ActivityInstrumentationTestCase2 を拡張しない場合、AndroidTestCase には、コンテキストをフィールドとして格納する保護された mContext があります。

その後は、このコンテキストをメソッドに渡してテストするだけです。

したがって、最終的なコードは次のようになります。

@Test
public void testPowerConnected_AssertParamA1Connected_ReturnTrue() {
    Docking docking = new Docking();
    //MockContext context = new CustomMock();
    boolean result = docking.powerConnected(mContext);
    assertTrue("Expected true and get "+result,result);
}
于 2013-05-29T13:14:42.043 に答える
0

Dockingが のサブクラスである場合、次のActivityことはできません。

Docking docking = new Docking();

Android フレームワークのみが Android コンポーネント (Activity、Service、BroadcastReceiver、ContentProvider) をインスタンス化できます。これは、コンストラクターを呼び出すだけでなく、適切なContext.

アクティビティのコンテキスト内で呼び出されている場合にのみ、アクティビティのメソッドをテストできます。これは、実際に Android に最初にアクティビティを作成させる必要があり、その後、そのアクティビティ内でメソッドをテストできることを意味します。

getApplicationContext()他のオプションは、メソッドを変更して、アクティビティ コンテキストの代わりにApplication コンテキストを使用するようにすることです。その場合、このメソッドを呼び出すためだけにアクティビティのインスタンスを作成する必要はありません。

于 2013-05-29T13:13:02.077 に答える