2014-02-27 46 views
6

当我对onCreate()方法检查特定服务是否正在运行的活动运行测试时,我得到一个NPE。在测试的设置方法,我称之为:当我检查运行服务在Roboelectric测试中时发生Nullpointerexception

ActivityController<MyActivity> ac = Robolectric.buildActivity(MyActivity.class).create(); 
    mActivity = ac.get(); 

在活动的onCreate()方法,我称之为isServiceRunning()

ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); 
    if(manager != null) { 
     for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
      if (service.service != null && "MyService".equals(service.service.getClassName())) { 
       return true; 
      } 
     } 
    } 
    return false; 

它无法与NPE在执行这个时候:

for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 

manager不是null,但NPE在Android库中的ActivityManager.getRunningServices(int)中抛出。

如果我需要这种方法通过,我应该怎么做?我正在使用Roboelectric 2.2-20130612.001729-6-jar-with-dependencies.jar,但即使使用最新版本,我也会看到问题。

我使用的是Android SDK版本19,但现在我切换到18,但仍然看到问题。

任何想法?

堆栈跟踪:

java.lang.NullPointerException 
at android.app.ActivityManager.getRunningServices(ActivityManager.java:1106) 
at com.example.MyActivity.isServiceRunning(MyActivity.java:151) 
at com.example.MyActivity.onCreate(MyActivity.java:43) 
at android.app.Activity.performCreate(Activity.java:5133) 
at org.fest.reflect.method.Invoker.invoke(Invoker.java:112) 
at org.robolectric.util.ActivityController$1.run(ActivityController.java:116) 
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:257) 
at org.robolectric.util.ActivityController.create(ActivityController.java:111) 
at org.robolectric.util.ActivityController.create(ActivityController.java:123) 
at com.example.test.MyActivityTest.setUp(MyActivityTest.java:44) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) 
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:233) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:174) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
+0

发布完整的例外跟踪。 –

+0

添加了跟踪。 – sr09

+0

你有没有解决这个问题? – Enrico

回答

1

你需要改变你的if语句要更具包容性。从功能上的android文档:
注意:此方法仅用于调试或实现服务管理类型用户界面。

所以我会建议你非常小心你的空检查(注意复数)。以下顺序很重要,或者您可能会在if语句的条件中收到空指针。

  1. 确保管理者不为空,然后
  2. 确保该列表<>不为空,然后
  3. 确保不为空。
    (null与empty之间的差别很大,例如:我们无法在空列表上运行.isEmpty()函数)。

if(manager != null && manager.getRunningServices(MAX) != null && !manager.getRunningServices(MAX).isEmpty() != null)

侧面说明:会更容易阅读支票号码1在保存的服务列表给一个变量,只是对变量a 第二if声明和然后在第二个if声明中执行您的for each声明。

相关问题