Android上的领域单元测试

Fra*_*ank 5 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)
Run Code Online (Sandbox Code Playgroud)

我的测试类开头是:

@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);
}
...
Run Code Online (Sandbox Code Playgroud)

我的朋友有:

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'
Run Code Online (Sandbox Code Playgroud)

怎么解决这个?

===编辑1 ===

我加入了我的gradle:

testCompile 'io.reactivex:rxjava:1.1.0'
Run Code Online (Sandbox Code Playgroud)

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}
Run Code Online (Sandbox Code Playgroud)

新的错误是

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)
Run Code Online (Sandbox Code Playgroud)

Fra*_*ank 8

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

这很容易,我不需要改变测试方法......

A.将测试类移动到"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'
Run Code Online (Sandbox Code Playgroud)

C.在测试类中,用AndroidJUnit4替换顶部的跑步者:

@RunWith(AndroidJUnit4.class)
public class MyClassTest extends TestCase {
...
Run Code Online (Sandbox Code Playgroud)

创建一个类型为"Android Tests"的Android运行配置,运行它,瞧,现在它将测试相同的方法,但在设备上.让我很开心.