17

我创建了一个新的 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 运行配置,但这没有帮助。

4

7 回答 7

15

此处描述的问题的解决方案: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 注释。

于 2014-05-14T08:37:25.960 回答
8

我遇到了同样的错误,我们使用了几种风格和构建类型所以,有一些步骤可以让它工作:

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 的简单链接

于 2015-11-25T09:49:59.533 回答
4

从 4.0 版本开始,@Config 的使用并没有受到高度赞赏,但是更新的入门指南解决了我的问题:http ://robolectric.org/getting-started/

只需修改一次 build.gradle,并加载 Manifest 文件,即可运行测试。

android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

github上的相关issue(也已经关闭):https ://github.com/robolectric/robolectric/issues/3328

于 2019-05-01T19:11:05.913 回答
1

您需要一个AndroidManifest.xml并且 Robolectric 当前取决于它位于项目根目录中,如路径所示。

于 2013-09-18T23:51:20.413 回答
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 )
于 2016-01-11T18:00:00.913 回答
0

我通过继承 RobolectricTestRunner 来覆盖 getConfigProperties()。请点击此链接:https ://stackoverflow.com/a/29907234/727654

于 2015-04-27T22:43:46.527 回答
0

我刚刚解决了与 Robolectric 相同的问题(版本:robolectric-2.4-jar-with-dependencies.jar)并返回未知资源,同时从不同的 values-* 文件夹加载资源,例如:

<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-inch-tablet...

于 2015-03-18T08:18:58.023 回答