ルームデータベースのテストに問題があります。テストを実行すると、次の例外が発生します。
Java.lang.RuntimeException: cannot find implementation for database.TicketDatabase. TicketDatabase_Impl does not exist
at Android.Arch.persistence.room.Room.getGeneratedImplementation(Room.Java:92)
at Android.Arch.persistence.room.RoomDatabase$Builder.build(RoomDatabase.Java:454)
at com.sw.ing.gestionescontrini.DatabaseTest.setDatabase(DatabaseTest.Java:36)
at Java.lang.reflect.Method.invoke(Native Method)
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.RunBefores.evaluate(RunBefores.Java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:57)
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.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.junit.runners.Suite.runChild(Suite.Java:128)
at org.junit.runners.Suite.runChild(Suite.Java:27)
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.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:115)
at Android.support.test.internal.runner.TestExecutor.execute(TestExecutor.Java:59)
at Android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.Java:262)
at Android.app.Instrumentation$InstrumentationThread.run(Instrumentation.Java:1886)
クラスDatabaseTest:
public class DatabaseTest {
TicketDatabase database;
DAO ticketDAO;
@Before
public void setDatabase() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Context context = InstrumentationRegistry.getTargetContext();
database = Room.inMemoryDatabaseBuilder(context, TicketDatabase.class).build();
Method method = TicketDatabase.class.getDeclaredMethod("ticketDao()");
method.setAccessible(true);
ticketDAO = (DAO) method.invoke(database, null);
}
}
gradleファイル:
apply plugin: 'com.Android.application'
Android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.sw.ing.gestionescontrini"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
}
defaultConfig {
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
})
compile 'com.Android.support:appcompat-v7:26.+'
compile 'com.Android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
annotationProcessor 'Android.Arch.lifecycle:compiler:1.0.0'
compile 'Android.Arch.persistence.room:rxjava2:1.0.0-rc1'
testCompile'Android.Arch.persistence.room:testing:1.0.0-rc1'
}
私はこの実装がどうあるべきか本当に知りません、私は解決策を探しましたが、私が見つけたすべては私のために働きません。たとえば、多くの人がkapt「Android.Arch.persistence.room ...」を追加するソリューションを見つけましたが、gradleは「kapt」を認識しません。
kapt
はKotlin用です。
まず、追加します:
annotationProcessor "Android.Arch.persistence.room:compiler:1.0.0"
dependencies
クロージャに。
次に、Android.Arch.persistence.room:rxjava2
とAndroid.Arch.persistence.room:testing
を1.0.0
ではなく1.0.0-rc1
にアップグレードします。
参照: https://developer.Android.com/jetpack/androidx/releases/room
kotlinの場合、gradleファイルの「annotationProcessor」キーワードを「kapt」に変更します。
kapt "Android.Arch.persistence.room:compiler:1.1.1"
また、依存関係ファイルの上に追加します
apply plugin: 'kotlin-kapt'
参照: https://developer.Android.com/jetpack/androidx/releases/room
Kotlinを使用する場合は、このコードが成績ファイルに存在することを確認してください。
apply plugin: "kotlin-kapt"
// Room
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
ドキュメント: https://developer.Android.com/jetpack/androidx/releases/room
この辺りの一部の人々(Vishu Bhardwajと同様のStackOverflowの質問に関する他の人々)は、受け入れられた答えが彼らのために働かないと不平を言うのを見ます。私は同様の問題を抱えていたことに言及するに値すると思いますMULTIモジュールプロジェクトで受け入れられた答えの周りにトリックが必要でした。
私のマルチモジュールプロジェクトでは、ルームデータベースの依存関係がほとんど1つの基本モジュールに含まれ、適切なAPI表記を使用してエクスポートされましたが、ルームコードは2つの異なるモジュールに分割されました。警告なしでコンパイルされたプロジェクトJava.lang.RuntimeException:データベースの実装が見つかりません...が実行時に発生しました。
これは追加することで修正されました
annotationProcessor "Android.Arch.persistence.room:compiler:$room_version"
ルーム関連コードを含むすべてのモジュール。
このgradleはうまく機能します。最初にプラグインkotlin-kaptに注目してください。それは重要です。
apply plugin: 'kotlin-kapt'
apply plugin: 'com.Android.application'
apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-Android-extensions'
Android {
compileSdkVersion 28
defaultConfig {
applicationId "????"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.Android.support:appcompat-v7:28.0.0'
implementation 'com.Android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.Android.support.test:runner:1.0.2'
androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.2'
implementation 'Android.Arch.persistence.room:runtime:1.1.1'
kapt 'Android.Arch.persistence.room:compiler:1.1.1'
}
上記の答えで誰もが言ったように、私はまだ運がありませんでした。
私の問題は、メインスレッドで挿入を行っていたことです。
roomDatabase = Room.databaseBuilder(DexApplication.getInstance(),MyRoomDatabase.class,"db_name")
.fallbackToDestructiveMigration() // this is only for testing,
//migration will be added for release
.allowMainThreadQueries() // this solved the issue but remember that its For testing purpose only
.build();
説明:
.allowMainThreadQueries()
メインスレッドでクエリを実行できます。しかし、それを削除して、RxJava、Live Data、またはデータベースを照会するための他のバックグラウンドプロセスメカニズムを実装することを忘れないでください。それが役立つことを願っています。
以下のプラグインと依存関係を追加
プラグインを適用: 'kotlin-kapt'
kapt "Android.Arch.persistence.room:compiler:1.1.1"