android - Android 上的 Realm 单元测试

标签 android unit-testing realm

尝试对调用 Realm (0.87.4) 的类进行单元测试,测试设置失败并显示

java.lang.NoClassDefFoundError: rx/Observable$OnSubscribe
at io.realm.RealmConfiguration$Builder.<init>(RealmConfiguration.java:279)
at org.testapp.db.MyClassTest.setUp(MyClassTest.java:34)
... 
Caused by: java.lang.ClassNotFoundException: rx.Observable$OnSubscribe
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)

我的测试类开始于:

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest extends TestCase {

@Rule
public TemporaryFolder testFolder = new TemporaryFolder();

Realm realm;

@Before
public void setUp() throws Exception {
    File tempFolder = testFolder.newFolder("realmdata");
    RealmConfiguration config = new RealmConfiguration.Builder(tempFolder).build();

    realm = Realm.getInstance(config);
}
...

我的 gradle 有:

testCompile 'junit:junit:4.12'
testCompile "org.mockito:mockito-core:1.10.19"
testCompile "org.robolectric:robolectric:3.0"
compile 'io.realm:realm-android:0.87.4'

如何解决?

=== 编辑 1 ===

我添加到我的gradle:

testCompile 'io.reactivex:rxjava:1.1.0'

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}

新的错误是

java.lang.UnsatisfiedLinkError: no realm-jni in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
at java.lang.Runtime.loadLibrary0(Runtime.java:849)
at java.lang.System.loadLibrary(System.java:1088)
at io.realm.internal.RealmCore.loadLibrary(RealmCore.java:117)

最佳答案

在您正在测试的类中使用 Realm 时,单元测试很难或不可能(感谢 Dmitry 提到)。我能做的是将测试作为仪器测试运行(感谢 Dmitry、Christian)。

这很容易,我不需要对测试方法进行任何更改...

一个。将测试类移动到“androidTest”文件夹,而不是“test”。 (从 Android Studio 1.1 开始,您应该将单元测试放在/src/test 中,将 Android Instrumentation 测试放在/src/androidTest 中)

B.在 gradle 构建文件中添加仪器测试的依赖项,使用“androidTest”因为它们是仪器测试:

androidTestCompile 'junit:junit:4.12'
androidTestCompile 'io.reactivex:rxjava:1.1.0'
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test:rules:0.4.1'
androidTestCompile 'com.android.support:support-annotations:23.1.1'

C.在测试类中,将顶部的运行器替换为 AndroidJUnit4:

@RunWith(AndroidJUnit4.class)
public class MyClassTest extends TestCase {
...

创建一个“Android 测试”类型的 Android 运行配置,运行它,瞧,它现在可以很好地测试相同的方法,但是是在设备上。让我很开心。

关于android - Android 上的 Realm 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35153240/

相关文章:

android - Android 中的表格布局问题?

javascript - 是否可以长按WebView以返回我单击的位置?

c# - Moq 简单示例所需 - 数据库连接和文件处理

silverlight - 使用 StatLight 和 TeamCity 自动化 silverlight 单元测试

swift - 如何切换数据库?

ios - 从 MagicalRecord 到 Realm.io 的等价物 "completion handler"

android - 如何使用子进程写入文件

.net - 自动单元测试示例代码

ios - 在 UITableView 中的 UINib 中重新加载 UITableView

javascript - onload android 方向检测? (提供代码)