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

标签 android realm robolectric robolectric-gradle-plugin

我只是想测试获取字符串资源是否等于我认为它应该等于的值。我的问题似乎是我的项目中有 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");
    }

}

看起来确实试图调用 Realm

java.lang.UnsatisfiedLinkError: Can't load library: 
/var/folders/3x/ddxtg5fs1hxgqrp6h63vsc140000gp/T/android-tmp-
robolectric3612430387389787158/app_lib/librealm-jni.dylib.3.5.0

编辑: 我尝试了更多的东西,似乎在 @Config 注释中设置 manifest 是个问题,但后来我得到了一个 android .content.res.Resources$NotFoundException:未知资源 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);
    }
}

但我得到一个:

android.content.res.Resources$NotFoundException: 未知资源 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);
    }
}

我明白了

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

最佳答案

如果你有一个重量级的 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 {

如果您根据 getting started instructions 使用 Mac 或 Linux,还要确保将 Working Directory 设置为 $MODULE_DIR$

module dir in working directory

关于Android - 使用 Robolectric 测试字符串资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45226450/

相关文章:

java - 如何将 String 转换为 int 并使用 Comparator 进行比较

ios - 将图像数组添加到 Realm 数据库

android - 我可以只为状态栏设置 FLAG_LAYOUT_NO_LIMITS 吗?

ios - 在框架内使用 Realm

android - 如何在 Realm for Java 中将 RealmObject 序列化为 JSON?

android - Robolectric 说 "AndroidManifest.xml not found"

java - 如何结合 PowerMock 和 Robolectric

android - 您应用的 AndroidManifest.xml 中的元数据标记没有正确的值

android - 如何使 ImageView 可见、暂停 5 秒、不可见、暂停 5 秒等等

java - 是否有从其他 Activity 类访问 MainActivity 的解决方案?