Android系统。如何测试在活动Context上使用Intent的方法

时间:2013-05-29 11:14:09

标签: android unit-testing android-intent

在试图通过本网站和其他人发现这三天之后,我真的需要你的帮助。

我想测试一个类中的方法。此方法使用活动类上下文来调用intent。 当我从测试方法调用它时,我得到一个NullPointerException。 我怎样才能做到这一点? (请添加示例代码)。

Accesories是ActivityClass。

Docking类中的Method:

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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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);
}

答案 2 :(得分:0)

您是否考虑过将powerConnected()函数设为静态?

然后就没有必要了
Docking docking = new Docking()

我想象的是导致你的问题....如果不是那么我建议发布LogCat输出。

答案 3 :(得分:0)

如果DockingActivity的子类,则无法执行此操作:

Docking docking = new Docking();

只有Android框架可以实例化Android组件(Activity,Service,BroadcastReceiver,ContentProvider),因为它不仅调用构造函数,还会设置相应的Context

如果在该活动的上下文中调用活动的方法,则只能测试活动的方法。这意味着您需要先让Android创建活动,然后才能测试该活动中的方法。

您的另一个选择是更改方法,以便它使用getApplicationContext()而不是活动上下文来使用应用程序上下文。在这种情况下,您不必为了调用此方法而创建活动的实例。