2014-01-21 2 views
2

У меня есть вид с настраиваемой темой, как описано here, и это решает описанную проблему, но вызывает следующую ошибку при вызове visible() на ActivityController.

android.content.res.Resources$NotFoundException: Resource ID #0x7f0c0000 
at android.content.res.Resources.getValue(Resources.java:1118) 
at android.content.res.Resources.loadXmlResourceParser(Resources.java:2304) 
at android.content.res.Resources.getLayout(Resources.java:934) 
at android.support.v7.internal.view.SupportMenuInflater.inflate(SupportMenuInflater.java:115) 
at com.myCompany.myApp.activities.LogActivity.onCreateOptionsMenu(LogActivity.java:36) 
at android.app.Activity.onCreatePanelMenu(Activity.java:2504) 
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:224) 
at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:232) 
at android.support.v7.app.ActionBarActivityDelegateICS.onCreatePanelMenu(ActionBarActivityDelegateICS.java:147) 
at android.support.v7.app.ActionBarActivity.onCreatePanelMenu(ActionBarActivity.java:199) 
at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onCreatePanelMenu(ActionBarActivityDelegateICS.java:285) 
at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:413) 
at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:775) 
at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:198) 
at org.robolectric.util.Scheduler.postDelayed(Scheduler.java:37) 
at org.robolectric.shadows.ShadowLooper.post(ShadowLooper.java:207) 
at org.robolectric.shadows.ShadowHandler.postDelayed(ShadowHandler.java:56) 
at android.os.Handler.postDelayed(Handler.java) 
at android.view.ViewRootImpl$RunQueue.executeActions(ViewRootImpl.java:6230) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1239) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
at android.view.Choreographer.doFrame(Choreographer.java:532) 
at android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:664) 
at org.robolectric.shadows.ShadowHandler.routeMessage(ShadowHandler.java:125) 
at org.robolectric.shadows.ShadowHandler.access$100(ShadowHandler.java:25) 
at org.robolectric.shadows.ShadowHandler$1.run(ShadowHandler.java:110) 
at org.robolectric.util.Scheduler$PostedRunnable.run(Scheduler.java:162) 
at org.robolectric.util.Scheduler.runOneTask(Scheduler.java:107) 
at org.robolectric.util.Scheduler.advanceTo(Scheduler.java:92) 
at org.robolectric.util.Scheduler.advanceToLastPostedRunnable(Scheduler.java:68) 
at org.robolectric.util.Scheduler.unPause(Scheduler.java:25) 
at org.robolectric.shadows.ShadowLooper.unPause(ShadowLooper.java:228) 
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:267) 
at org.robolectric.util.ActivityController.visible(ActivityController.java:201) 
at com.myCompany.myApp.test.activities.LogActivityTest.setUp(LogActivityTest.java:50) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:230) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:172) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Вот файл, который содержит syle.xml пользовательской теме

<!-- 
    Base application theme, dependent on API level. This theme is replaced 
    by AppBaseTheme from res/values-vXX/styles.xml on newer devices. 
--> 
<style name="AppBaseTheme" parent="android:Theme.Light"> 
    <!-- 
     Theme customizations available in newer API levels can go in 
     res/values-vXX/styles.xml, while customizations related to 
     backward-compatibility can go here. 
    --> 
</style> 

<!-- Application theme. --> 
<style name="AppTheme" parent="AppBaseTheme"> 
    <!-- All customizations that are NOT specific to a particular API-level can go here. --> 
</style> 

<style name="Theme.RobolectricCompatible" parent="@style/Theme.Base.AppCompat.Light.DarkActionBar"> 
    <item name="android:windowNoTitle">false</item> 
</style> 

и это блок деятельности, в которой я поставил тему

<activity 
     android:name=".activities.LogActivity" 
     android:label="@string/log_activity_title" 
     android:parentActivityName="com.myApp.activities.MainActivity" 
     android:theme="@style/Theme.RobolectricCompatible" > 
     <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
     android:value="com.myApp.activities.MainActivity" /> 
</activity> 

У меня есть другая активность, которая использует тему Theme.Base.AppCompat.Light.DarkActionBar, и я могу проверить ее правильно, но если я изменю тему на Theme.RobolectricCompatible, она будет показывать то же поведение.

Наконец это то, что выход Eclipse, когда я запускаю тесты:

DEBUG: Loading resources for com.myCompany.myApp from C:\Users\luca\Android\myAppTest\..\myApp\res... 
    DEBUG: Loading resources for android.support.v7.appcompat from C:\Users\luca\Android\myAppTest\..\myApp\..\android-support-v7-appcompat\res... 
    DEBUG: Loading resources for android from jar:C:\Users\luca\.m2\repository\org\robolectric\android-all\4.3_r2-robolectric-0\android-all-4.3_r2-robolectric-0.jar!/res... 

Пожалуйста, обратите внимание, что пути указывают на правильные Рез каталогов.

Без вызова visible() я не получаю ошибку, но мне нужно, чтобы проверить некоторую MENUITEM s, которые инициализируются в onCreateOptionsMenu(), которые, в свою очередь, называются внутри visible() (я уже пытался вызвать метод самого пропускания TestMenu объект, но он не работает (а также устаревшее))

Я использую robolectric 2.2, но я также попытался с 2,3-SNAPSHOT

Я бы очень признателен за любую помощь, потому что я заканчиваются идеи.

+0

Try искать в сгенерированном R файл значение # 0x7f0c0000, может быть, это может быть показать вам ресурс, который может иметь проблемы. Если это не работает, попробуйте удалить элемент за элементом блока стиля, таким образом вы можете найти более конкретную проблему. –

+0

@ phemt.latd Значение # 0x7f0c0000 - это R.menu.log, xml-файл, который я пытаюсь раздуть в onCreateOptionsMenu (6-я строка stacktrace). Это обычный файл xml menù, отличный от других, которые есть в моем проекте, и, похоже, не содержит ошибок. – LucaD

+0

еще одна вещь, которая, возможно, не ясна: приложение компилируется и отлично работает на реальных устройствах, я получил эту проблему, только когда запускаю тесты Robolectric. – LucaD

ответ

8

Проблема заключается в том, что вы используете библиотеку поддержки, а robolectric несовместим с ней. То же самое происходит с ActionBarSherlock.

К счастью, проблема уже решена. Это сработало для меня.

Согласно сообщению sneuberger-амазонки на https://github.com/robolectric/robolectric/issues/:

Проблема заключается в том, что Robolectric обеспечивает ShadowMenuInflater, но это не дает ShadowSupportMenuInflater (что использует AppCompat).

Вы можете исправить это, создав класс org.robolectric.shadows.ShadowSupportMenuInflater с содержимым:

package org.robolectric.shadows; 

import org.robolectric.annotation.Implementation; 
import org.robolectric.annotation.Implements; 

import android.support.v7.internal.view.SupportMenuInflater; 
import android.view.Menu; 

@Implements(SupportMenuInflater.class) 
public class ShadowSupportMenuInflater extends ShadowMenuInflater { 
    @Implementation 
    public void inflate(int menuRes, Menu menu) { 
     super.inflate(menuRes, menu); 
    } 
} 

Поместите этот класс в пакете org.robolectric.shadows вашего собственного проекта. Таким образом Robolectric найдет его при поиске тени для SupportMenuInflater, так что все ваши тесты получат его автоматически (нет необходимости добавлять тень Config для каждого теста).

+0

Я больше не работаю над этим проектом, поэтому не могу сказать, решает ли это мою проблему, но я соглашусь с ней upvotes. – LucaD

+0

Отлично ..! Это также работает на robolectric 2.4. Благодарю. – vijay

1

С Robolectric 2.3, попробуйте аннотирование тестового класса с

@Config(qualifiers = "v10") 
Смежные вопросы