我已经创建了一个新的TestProject并在我的testMethod中添加了以下行:
Robolectric.getShadowApplication().getString(R.string.mystring);
我的测试失败了
android.content.res.Resources$NotFoundException: unknown resource 2131558482
控制台显示以下警告:
WARNING: No manifest file found at .\..\..\MyProject\AndroidManifest.xml.Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).
WARNING: no system properties value for ro.build.date.utc
AndroidManifest.xml是否需要获取字符串资源? 我尝试通过 org.robolectric.Config.properties 和 @Config 添加Manifest,但警告仍然出现,我无法获取字符串资源。我确保清单的相对路径是正确的。 我也试过更改JUnit运行配置,但这没有帮助。
答案 0 :(得分:13)
解决此处描述的问题: http://blog.futurice.com/android_unit_testing_in_ides_and_ci_environments
失踪的清单
你现在应该注意到Robolectric抱怨无法找到你的Android Manifest。我们将通过编写自定义测试运行器来解决这个问题。将以下内容添加为app / src / test / java / com / example / app / test / RobolectricGradleTestRunner.java:
package com.example.app.test;
import org.junit.runners.model.InitializationError;
import org.robolectric.manifest.AndroidManifest;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.res.Fs;
public class RobolectricGradleTestRunner extends RobolectricTestRunner {
public RobolectricGradleTestRunner(Class<?> testClass) throws InitializationError {
super(testClass);
}
@Override
protected AndroidManifest getAppManifest(Config config) {
String myAppPath = RobolectricGradleTestRunner.class.getProtectionDomain()
.getCodeSource()
.getLocation()
.getPath();
String manifestPath = myAppPath + "../../../src/main/AndroidManifest.xml";
String resPath = myAppPath + "../../../src/main/res";
String assetPath = myAppPath + "../../../src/main/assets";
return createAppManifest(Fs.fileFromPath(manifestPath), Fs.fileFromPath(resPath), Fs.fileFromPath(assetPath));
}
}
请记住在测试类中更改RunWith注释。
答案 1 :(得分:7)
我遇到了同样的错误,我们使用了几种风格和构建类型因此,有一些步骤可以使它工作:
1)Android studio测试运行配置
您还必须在Windows中将工作目录设置为$ MODULE_DIR $。 http://robolectric.org/getting-started/应该这样说。
2)单元测试应该注释如下:
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21, manifest = "src/main/AndroidManifest.xml", packageName = "com.example.yourproject")
public class SomeFragmentTest {
这里我们有清单文件和packageName的简单链接
答案 2 :(得分:1)
你需要一个AndroidManifest.xml
,而Robolectric目前依赖于它在路径所暗示的项目根目录。
答案 3 :(得分:1)
我注意到我曾经在我的测试类顶部声明了这样的清单
@RunWith(RobolectricTestRunner.class)
@Config( constants = BuildConfig.class, manifest="app/src/main/AndroidManifest.xml", sdk = 21 )
我现在改用它来工作。
@RunWith(RobolectricTestRunner.class)
@Config( constants = BuildConfig.class, manifest="src/main/AndroidManifest.xml", sdk = 21 )
答案 4 :(得分:0)
我刚刚解决了与Robolectric(ver:robolectric-2.4-jar-with-dependencies.jar)相同的问题,并返回了未知资源,同时从不同的值加载资源 - *文件夹,例如:
<resources>
<string name="screen_type">10-inch-tablet</string>
</resources>
在我的情况下,我想识别不同的设备。出于这个原因,我在以下文件夹中创建了screen.xml:
values/screen.xml - mobile
values-sw600dp/screen.xml - 7-inch tablet
values-sw720dp/screen.xml - 10-inch tablet
我的工作区如下:
workspace
\-ExProj
\-exProj
\-src
\-exProj
\-AndroidManifest.xml
\-ExProjTest
使用Robolectric进行单元测试:
@RunWith(RobolectricTestRunner.class)
@Config(manifest = "./../ExProj/exProj/src/exProj/AndroidManifest.xml")
public class UtilityTest {
@Test
@Config(qualifiers = "sw720dp")
public void testIfDeviceIsTablet() throws Exception {
System.out.println(Robolectric.application.getString(R.string.screen_type));
}
}
以上测试代码在控制台上打印出来:10英寸平板电脑......
答案 5 :(得分:0)
我通过继承RobolectricTestRunner来覆盖getConfigProperties()。请点击此链接:https://stackoverflow.com/a/29907234/727654
答案 6 :(得分:0)
从4.0版本开始,对@Config的使用并不高度赞赏,但是更新的《入门指南》解决了我的问题:http://robolectric.org/getting-started/
只有一个build.gradle修改,并且加载了Manifest文件,测试才能运行。
android {
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
github上的相关问题(也已关闭):https://github.com/robolectric/robolectric/issues/3328