結構詰まってしまったのでメモ。
こんなエラー
バージョン 3.0
の場合
java.lang.NullPointerException
org.robolectric.shadows.ShadowLooper.getMainLooper(ShadowLooper.java:70)
android.os.Looper.getMainLooper(Looper.java)
android.database.sqlite.SQLiteDatabase.isMainThread(SQLiteDatabase.java:391)
android.database.sqlite.SQLiteDatabase.getThreadDefaultConnectionFlags(SQLiteDatabase.java:381)
android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)
バージョンを 3.1-rc1
( 2016-04-25 現在の最新 ) に上げても…
java.lang.IllegalStateException: Illegal connection pointer 1. Current pointers for thread Thread[pool-5-thread-1,5,main] []
org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:467)
org.robolectric.shadows.ShadowSQLiteConnection$Connections.prepareStatement(ShadowSQLiteConnection.java:373)
org.robolectric.shadows.ShadowSQLiteConnection.nativePrepareStatement(ShadowSQLiteConnection.java:64)
android.database.sqlite.SQLiteConnection.nativePrepareStatement(SQLiteConnection.java)
android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)
(´・ω:;.:...
回避策
普通に SQLite を利用した場合は問題なかったので、
どうやら別なスレッドから参照するとダメらしい…ということで
import java.util.concurrent.Executor
import scala.concurrent.ExecutionContext
implicit lazy val executor: ExecutionContext = {
ExecutionContext fromExecutor new Executor {
override def execute(command: Runnable) = command.run()
}
}
テスト中だけスレッドを生成しない ExecutionContext に切り替えてしまえば無事に動いてくれる。
やった!
参考(にならなかった)リンク
ちなみにこれらは全てうまくいかなかった情報です