0

经过三天试图通过这个网站和其他网站找到这个,我真的需要你的帮助。

我想在一个类中测试一个方法。此方法使用活动类上下文来调用意图。当我从测试方法调用它时,我得到一个 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()而不是活动上下文。在这种情况下,您不必为了调用此方法而创建活动实例。

于 2013-05-29T13:13:02.077 回答
0

您是否考虑过将 powerConnected() 函数设为静态?那么就不需要

Docking docking = new Docking()

我想这会导致您的问题....如果不是,那么我建议发布 LogCat 输出。

于 2013-05-29T11:18:10.670 回答