Android - 使用Robolectric测试字符串资源

EGH*_*HDK 4 android realm robolectric robolectric-gradle-plugin

我只想测试获取一个String资源等于我认为它应该相等.我的问题似乎是我的项目中有Realm.我知道Robolectric不支持Realm(它在文档中说明了它),但我根本没有调用Realm,所以我觉得可能有办法做到这一点.

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

import static org.junit.Assert.assertEquals;

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21, manifest = "app/src/main/AndroidManifest.xml")
public class ResourceTester {

    @Test
    public void testingString() {
        String resourceString = RuntimeEnvironment.application.getString(R.string.app_name);
        assertEquals(resourceString, "Yeah");
    }

}
Run Code Online (Sandbox Code Playgroud)

它看起来像它IS试图调用境界

java.lang.UnsatisfiedLinkError: Can't load library: 
/var/folders/3x/ddxtg5fs1hxgqrp6h63vsc140000gp/T/android-tmp-
robolectric3612430387389787158/app_lib/librealm-jni.dylib.3.5.0
Run Code Online (Sandbox Code Playgroud)

编辑:我尝试了更多的东西,似乎设置manifest@Config注释是问题,但后来我得到了android.content.res.Resources$NotFoundException: unknown resource 2131362072

还有其他想法吗?我可以创建另一个Realm未调用的Application类吗?/ test目录如何知道?

编辑大卫:

我试过这个:

@RunWith(RobolectricGradleTestRunner.class)
@Config(application = TestingApplication.class, constants = BuildConfig.class, sdk = 21)
public class ResourceTester {
    @Test
    public void newTestingTests() throws Exception {
        String appName = RuntimeEnvironment.application.getString(R.string.app_name);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个:

android.content.res.Resources$NotFoundException: unknown resource 2131362072

如果我改成它

@RunWith(RobolectricTestRunner.class)
//@RunWith(RobolectricGradleTestRunner.class)
@Config(application = TestingApplication.class, constants = BuildConfig.class, sdk = 21)
public class ResourceTester {
    @Test
    public void newTestingTests() throws Exception {
        String appName = RuntimeEnvironment.application.getString(R.string.app_name);
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白了

WARNING: No manifest file found at ./AndroidManifest.xml.Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).

android.content.res.Resources$NotFoundException: unknown resource 2131362072
Run Code Online (Sandbox Code Playgroud)

Dav*_*son 9

如果您有一个重量级的Application类(例如,依赖于Realm,Crashlytics等)并且您的单元测试没有引用这些,您可以android.app.Application在配置中用作您的Application类:

@RunWith(RobolectricTestRunner.class)
@Config(application = android.app.Application.class, manifest="src/main/AndroidManifest.xml", sdk = 23)
public class ResourceTester {
Run Code Online (Sandbox Code Playgroud)

如果您按照入门说明使用Mac或Linux,请确保已Working Directory设置为$MODULE_DIR$

工作目录中的模块目录