Android - 使用 Robolectric 测试字符串资源
Android - Testing a string resource with Robolectric
我只是想测试获取字符串资源是否等于我认为它应该等于的值。我的问题似乎是我的项目中有 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: unknown resource 2131362072
还有其他想法吗?我可以创建另一个没有调用 Realm
的应用程序 class 吗? /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: 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);
}
}
我明白了
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
如果您有一个重量级应用程序 class(例如,依赖于 Realm、Crashlytics 等)并且您的单元测试不引用这些,您可以使用 android.app.Application
作为您的应用程序 class 在配置中:
@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$
我只是想测试获取字符串资源是否等于我认为它应该等于的值。我的问题似乎是我的项目中有 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: unknown resource 2131362072
还有其他想法吗?我可以创建另一个没有调用 Realm
的应用程序 class 吗? /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: 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);
}
}
我明白了
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
如果您有一个重量级应用程序 class(例如,依赖于 Realm、Crashlytics 等)并且您的单元测试不引用这些,您可以使用 android.app.Application
作为您的应用程序 class 在配置中:
@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$