簡體   English   中英

使用Robolectric的ContentProvider測試

[英]ContentProvider test using Robolectric

我創建了一個自定義ContentProvider,由Sqlite查詢,更新,插入等實現。在我的代碼中,我使用了此ContentProvider來存儲我的數據。 現在,我想使用Robolectric對我的應用程序進行單元測試。 但是測試代碼將失敗,如下所示,

java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.podcast.rick.database.PodcastProvider.query(PodcastProvider.java:61)
at org.robolectric.shadows.ShadowContentResolver.query(ShadowContentResolver.java:157)
at android.content.ContentResolver.query(ContentResolver.java)
at com.podcast.rick.rpodcast.RssReaderTest.parseRSS(RssReaderTest.java:61)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.robolectric.RobolectricTestRunner$HelperTestRunner$1.evaluate(RobolectricTestRunner.java:487)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.robolectric.internal.SandboxTestRunner$2.evaluate(SandboxTestRunner.java:209)
at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:109)
at org.robolectric.internal.SandboxTestRunner.runChild(SandboxTestRunner.java:36)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.robolectric.internal.SandboxTestRunner$1.evaluate(SandboxTestRunner.java:63)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

可以看到Robolectric影子類首先被調用,

at org.robolectric.shadows.ShadowContentResolver.query(ShadowContentResolver.java:157)  
at android.content.ContentResolver.query(ContentResolver.java)

但最后的android代碼稱為

android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)

我認為在Robolectric單元測試中,應使用影子類而不是Android框架代碼,但是為什么在這里調用android.database.sqlite.SQLiteOpenHelper?

我的setUp方法如下

@Before
public void setUp() throws Exception {
   PodcastProvider provider = new PodcastProvider();
   provider.onCreate();
   Robolectric.setupContentProvider(PodcastProvider.class);
   ShadowContentResolver.registerProviderInternal("com.rick.podcast", provider);
}

有什么問題或遺漏嗎? 我正在使用Robolectric 3.3.1。

謝謝。

確保您已用注釋了您的測試課

@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class YourTestClass { ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM