Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未找到Robolectric 3资源错误_Java_Android_Unit Testing_Robolectric - Fatal编程技术网

Java 未找到Robolectric 3资源错误

Java 未找到Robolectric 3资源错误,java,android,unit-testing,robolectric,Java,Android,Unit Testing,Robolectric,我正试图将Robolectric3融入我的项目中,但我似乎遇到了比我预期的更多的问题。目前,我正试图通过以下方式在测试类的setUp方法中实例化一个简单的活动 MyActivity activity = Robolectric.setupActivity(MyActivity.class); 我已将以下内容放在测试文件的顶部: @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class)

我正试图将Robolectric3融入我的项目中,但我似乎遇到了比我预期的更多的问题。目前,我正试图通过以下方式在测试类的setUp方法中实例化一个简单的活动

MyActivity activity = Robolectric.setupActivity(MyActivity.class);
我已将以下内容放在测试文件的顶部:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
在MyActivity中,我只需通过以下方式访问字符串数组资源:

getResources().getStringArray(resId)
运行测试类(没有任何测试方法,只有实例化活动的setUp方法)后,我得到错误:

android.content.res.Resources$NotFoundException: String array resource ID #0x7f0c0000
at android.content.res.Resources.getStringArray(Resources.java:502)
at com.alivemobile.tpff.slidingtabs.views.SlidingTabsActivity$3.onItemSelected(SlidingTabsActivity.java:102)
at android.widget.AdapterView.fireOnSelected(AdapterView.java:897)
at android.widget.AdapterView.access$200(AdapterView.java:48)
at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:865)
at org.robolectric.util.Scheduler.runOrQueueRunnable(Scheduler.java:230)
at org.robolectric.util.Scheduler.postDelayed(Scheduler.java:85)
at org.robolectric.util.Scheduler.post(Scheduler.java:72)
at org.robolectric.shadows.ShadowView.post(ShadowView.java:401)
at android.view.View.post(View.java)
at android.widget.AdapterView.selectionChanged(AdapterView.java:882)
at android.widget.AdapterView.checkSelectionChanged(AdapterView.java:1047)
at android.widget.Spinner.layout(Spinner.java:586)
at android.widget.Spinner.onLayout(Spinner.java:527)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.support.v7.widget.Toolbar.layoutChildLeft(Toolbar.java:1565)
at android.support.v7.widget.Toolbar.onLayout(Toolbar.java:1504)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15596)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2072)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1829)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at org.robolectric.shadows.ShadowMessageQueue.dispatchMessage(ShadowMessageQueue.java:130)
at org.robolectric.shadows.ShadowMessageQueue.access$100(ShadowMessageQueue.java:30)
at org.robolectric.shadows.ShadowMessageQueue$1.run(ShadowMessageQueue.java:95)
at org.robolectric.util.Scheduler$ScheduledRunnable.run(Scheduler.java:269)
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:179)
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:160)
at org.robolectric.util.Scheduler.advanceBy(Scheduler.java:143)
at org.robolectric.util.Scheduler.unPause(Scheduler.java:54)
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:266)
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:306)
at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:45)
at org.robolectric.util.ActivityController.visible(ActivityController.java:173)
at org.robolectric.util.ActivityController.setup(ActivityController.java:210)
at org.robolectric.Robolectric.setupActivity(Robolectric.java:46)
at com.alivemobile.tpff.events.views.list.EventsListTests.setUp(EventsListTests.java:20)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251)
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188)
at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
我在谷歌上搜索过,看到一些人实现了一个定制的测试运行程序,我也尝试过一些,但他们似乎都过于复杂,没有太多的解释。 我错过了什么

提前谢谢

更新1 玩了一会儿之后,我发现如果我在setUp()方法中用以下命令实例化活动:

Robolectric.buildActivity(SlidingTabsActivity.class).create().start().resume().get();
而不是:

Robolectric.setupActivity(SlidingTabsActivity.class);
测试未给出“未找到资源”错误

但是,如果我通过以下方式开始活动:

Robolectric.buildActivity(SlidingTabsActivity.class).create().start().resume().visible().get();

然后我得到了ResourceNotFound错误。

我们在使用robolectric的测试中遇到了类似的问题。这是因为我们有不同的构建风格,它们与我们的包结构有不同的applicationId。 默认情况下,RobolectricGradleTestRunner类从src/main文件夹中拾取资源、资产和清单。因此,您不需要实现自定义测试运行程序。 检查gradle构建中的applicationId是否与包结构不同。您的应用程序ID可能是com.something.abc,而您的基本包可能是com.something.xyz 如果您对每个构建风格使用不同的构建风格和applicationId,那么我建议将以下内容添加到您的测试套件中

@Config(constants = BuildConfig.class, packageName = "com.something.xyz")

您可以像这样创建一个
CustomRobolectrictTestRunner

import org.junit.runners.model.InitializationError;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

public class CustomRobolectricTestRunner extends RobolectricTestRunner {
public CustomRobolectricTestRunner(Class<?> testClass) throws InitializationError {
    super(testClass);
}

@Override
protected Config buildGlobalConfig() {
    return Config.Builder.defaults()
            .setPackageName("com.x")
            .setManifest("build/intermediates/manifest/androidTest/debug/AndroidManifest.xml")
            .setResourceDir("../../../../res/merged/androidTest/debug") // relative to manifest
            .build();
}
}
@org.junit.runner.RunWith(CustomRobolectricTestRunner.class)
public class MyTestClass {
}

我们有所有资源的默认包,这个定制的TestRunner可以帮助我们

公共类RobolectricGradleTestRunner扩展了RobolectricTestRunner{
公共RobolectricGradleTestRunner(最终类testClass)引发初始化错误{
超级(测试类);
}
@凌驾
受保护的AndroidManifest getAppManifest(最终配置){
最后一个字符串myAppPath=RobolectricGradleTestRunner.class.getProtectionDomain().getCodeSource().getLocation().getPath();
最后一个字符串manifestPath=myAppPath+“../../../../../manifests/full/”+BuildConfig.FLAVOR+“/”+BuildConfig.BUILD_TYPE+“/AndroidManifest.xml”;
最后一个字符串resPath=myAppPath+“../../../../../res/merged/”+BuildConfig.FLAVOR+“/”+BuildConfig.BUILD\u TYPE;
最后一个字符串assetPath=myAppPath+“../../../../../../assets/”+BuildConfig.FLAVOR+“/”+BuildConfig.BUILD\u类型;
返回新的AndroidManifest(Fs.fileFromPath(manifestPath),
Fs.fileFromPath(resPath),
Fs.fileFromPath(assetPath),
BuildConfig.APPLICATION\u ID){
@凌驾
公共字符串getRClassName()引发异常{
返回“[your\u package\u name].R”;
}
};
}

}
@Config(constants=BuildConfig.class)
,您缺少
sdk=21
。向我们展示您的整个测试。我认为这不是问题所在,我已经在我的应用程序的build.gradle文件中指定了最高sdk版本21。整个测试非常简单:@RunWith(robollectricGradleTestRunner.class)@Config(constants=BuildConfig.class)和实例化活动的安装方法(我已经尝试了OP中提到的许多方法),您需要发布更多内容。这是应用程序吗?这是图书馆的吗?你的测验是什么?你的主要活动是什么?谢谢你的建议。我的applicationId似乎很好(它与src/main文件夹中的包名相同)。但是我发现了一些有趣的东西。我已经更新了OP以反映我的发现。它很有效!虽然更好的做法是使用“src/test/AndroidManifest.xml”作为清单,使用“./main/res”作为资源