2014-03-31 2 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(...)에서 발생합니다. 나는 contentUpdater이 조롱 당했기 때문에 execute(...)이 왜 불려지는지 알지 못한다. 나는 정말로 내 문제인 것처럼 보인다.

여기에 stacktrace가 있습니다.

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

execute()는 최종 방법이고 (예를 들어 PowerMock와, 바이트 코드 조작없이) 조롱 수 없다.

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

참조 케이? – behelit

관련 문제