2014-03-31 86 views
2

我很难用Android上的Mockito模拟AsyncTask。此测试由于NullPointerException而失败。使用mockito模拟AsyncTask导致NullPointerException

这是我的测试。我试着在UI线程上运行它;

@UiThreadTest 
public void testWhenUpdatingContent_ShouldExecuteContentUpdater() { 
    ContentUpdater contentUpdaterMock = mock(ContentUpdater.class); 
    ContentExtractor contentExtractorMock = mock(ContentExtractor.class); 
    ContentManager contentManager = new ContentManager(contentUpdaterMock, contentExtractorMock); 

    contentManager.updateContent(); 

    verify(contentUpdaterMock).execute(contentExtractorMock); 
} 

这里是ContentManager的非常简单的代码;

public class ContentManager { 

    private ContentUpdater contentUpdater; 
    private ContentExtractor contentExtractor; 

    public ContentManager(ContentUpdater contentUpdater, ContentExtractor contentExtractor) { 
     this.contentUpdater = contentUpdater; 
     this.contentExtractor = contentExtractor; 
    } 

    public void updateContent() { 

     contentUpdater.execute(contentExtractor); 
    } 
} 

contentUpdater.execute(...)发生异常。我甚至不明白为什么execute(...)被调用,因为contentUpdater被嘲笑,这真的好像是我的问题。

这里是堆栈跟踪;

java.lang.NullPointerException 
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:574) 
at android.os.AsyncTask.execute(AsyncTask.java:535) 
at com.axis4.adder_ladder.ContentManager.updateContent(ContentManager.java:15) 
at com.axis4.adder_ladder.test.ContentManagerTest.testWhenUpdatingContent_ShouldExecuteContentUpdater(ContentManagerTest.java:22) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214) 
at android.test.InstrumentationTestCase.access$000(InstrumentationTestCase.java:36) 
at android.test.InstrumentationTestCase$2.run(InstrumentationTestCase.java:189) 
at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1719) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5017) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
at dalvik.system.NativeStart.main(Native Method) 

回答

0

​​是最终方法,并且不能被模拟(无字节码操作,例如用PowerMock)。

public final AsyncTask<Params, Progress, Result> execute(Params... params) { 
    return executeOnExecutor(sDefaultExecutor, params); 
} 
+1

所以它是如何与PowerMoc完成K + – behelit