在试图通过本网站和其他人发现这三天之后,我真的需要你的帮助。
我想测试一个类中的方法。此方法使用活动类上下文来调用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);
}
非常感谢你。
答案 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)
如果Docking
是Activity
的子类,则无法执行此操作:
Docking docking = new Docking();
只有Android框架可以实例化Android组件(Activity,Service,BroadcastReceiver,ContentProvider),因为它不仅调用构造函数,还会设置相应的Context
。
如果在该活动的上下文中调用活动的方法,则只能测试活动的方法。这意味着您需要先让Android创建活动,然后才能测试该活动中的方法。
您的另一个选择是更改方法,以便它使用getApplicationContext()
而不是活动上下文来使用应用程序上下文。在这种情况下,您不必为了调用此方法而创建活动的实例。