android.content.res.ResourcesRobolectric2.4 中的 $NotFoundException
android.content.res.Resources$NotFoundException in Robolectric 2.4
当从命令行进行 运行 单元测试时,我无法加载资源。它在 IntelliJ 中运行良好。
我正在使用:
- com.android.tools.build:gradle:1.1.3
- org.robolectric:robolectric-gradle-插件:1.0.1
- org.robolectric:robolectric:2.4
我有以下项目结构(多模块):
+---module1
| | build.gradle
| \---src
| +---main
| | | AndroidManifest.xml
| | |
| | +---res
| | | \---values
| | | strings.xml
| \---test
| \---java
| \---example
| | FooTest.java
+---module2
etc
我的测试(简化)如下所示:
@Config(emulateSdk = 18, reportSdk = 18, manifest = "./src/main/AndroidManifest.xml")
@RunWith(RobolectricTestRunner.class)
public class FooTest {
@Test
public void test() {
String result = Robolectric.application.getString(R.string.error_message);
assertThat(result, notNullValue());
}
}
我得到这个堆栈跟踪:
android.content.res.Resources$NotFoundException: unknown resource 2131361826
at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:311)
at org.robolectric.shadows.ShadowAssetManager.getResourceText(ShadowAssetManager.java:69)
at android.content.res.AssetManager.getResourceText(AssetManager.java)
at android.content.res.Resources.getText(Resources.java:235)
at org.robolectric.shadows.ShadowResources.getText(ShadowResources.java:363)
at android.content.res.Resources.getText(Resources.java)
at android.content.res.Resources.getString(Resources.java:325)
at org.robolectric.shadows.ShadowContext.getString(ShadowContext.java:41)
at org.robolectric.shadows.ShadowContextWrapper.getString(ShadowContextWrapper.java:96)
at android.content.Context.getString(Context.java)
注意:我对Gradle很陌生,所以很可能某处配置错误。我假设通过遵循项目结构约定,我不需要指定在哪里可以找到资源。我尝试指定它们但没有任何运气:
android {
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
}
}
}
在调查过程中,我们找到了问题的原因。如果您使用 android gradle plugin v1.1.x
,那么您不需要使用 robolectric gradle plugin
。
请注意 robolectric gradle plugin
的不正确版本会破坏您的测试。
当从命令行进行 运行 单元测试时,我无法加载资源。它在 IntelliJ 中运行良好。
我正在使用:
- com.android.tools.build:gradle:1.1.3
- org.robolectric:robolectric-gradle-插件:1.0.1
- org.robolectric:robolectric:2.4
我有以下项目结构(多模块):
+---module1
| | build.gradle
| \---src
| +---main
| | | AndroidManifest.xml
| | |
| | +---res
| | | \---values
| | | strings.xml
| \---test
| \---java
| \---example
| | FooTest.java
+---module2
etc
我的测试(简化)如下所示:
@Config(emulateSdk = 18, reportSdk = 18, manifest = "./src/main/AndroidManifest.xml")
@RunWith(RobolectricTestRunner.class)
public class FooTest {
@Test
public void test() {
String result = Robolectric.application.getString(R.string.error_message);
assertThat(result, notNullValue());
}
}
我得到这个堆栈跟踪:
android.content.res.Resources$NotFoundException: unknown resource 2131361826
at org.robolectric.shadows.ShadowAssetManager.getAndResolve(ShadowAssetManager.java:311)
at org.robolectric.shadows.ShadowAssetManager.getResourceText(ShadowAssetManager.java:69)
at android.content.res.AssetManager.getResourceText(AssetManager.java)
at android.content.res.Resources.getText(Resources.java:235)
at org.robolectric.shadows.ShadowResources.getText(ShadowResources.java:363)
at android.content.res.Resources.getText(Resources.java)
at android.content.res.Resources.getString(Resources.java:325)
at org.robolectric.shadows.ShadowContext.getString(ShadowContext.java:41)
at org.robolectric.shadows.ShadowContextWrapper.getString(ShadowContextWrapper.java:96)
at android.content.Context.getString(Context.java)
注意:我对Gradle很陌生,所以很可能某处配置错误。我假设通过遵循项目结构约定,我不需要指定在哪里可以找到资源。我尝试指定它们但没有任何运气:
android {
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
}
}
}
在调查过程中,我们找到了问题的原因。如果您使用 android gradle plugin v1.1.x
,那么您不需要使用 robolectric gradle plugin
。
请注意 robolectric gradle plugin
的不正确版本会破坏您的测试。