2014-02-20 2 views
2

В настоящее время я сталкиваюсь с проблемой получения <meta-data> тегов из моего файла AndroidManifest, находясь внутри инструментария.Получить метаданные из манифеста в UnitTest

Я использую библиотеку (Sugar ORM), которая хранит важную информацию внутри этих тегов. Как только я использую библиотеку внутри проверяемого кода, я сталкиваюсь с проблемами.

AndroidManifest.xml 

<manifest package="org.something" ...> 
    ... 
    <application ...> 
     <meta-data android:name="DATABASE" android:value="foo.db" /> 
     ... 
    </application> 
</manifest> 

Извлечение метаданных работает так:

PackageManager pm = context.getPackageManager(); 
try { 
    ApplicationInfo ai = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); 
    value = ai.metaData.getString(name); 
} catch (Exception e) { 
    Log.d("sugar", "Couldn't find config value: " + name); 
} 

Тест работает как InstrumentationTestCase и устанавливает контекст быть getInstrumentation().getContext().

+0

В чем проблема, с которой вы сталкиваетесь? Вы только что желали, что делаете. – n00bc0der

+0

Я обошел проблему пока, не используя SugarORM больше. Проблема заключалась в том, что библиотека не могла загрузить свои метаданные из файла манифеста. Таким образом, данный код генерирует исключение. – Paul

ответ

0

Проблема заключается в том, что InstrumentationTestCase не содержит мета-данные из вашего приложения. Все, что вам нужно сделать, это расширить ApplicationTestCase<Application> для вашего тестового класса.

Вы можете вызвать getContext() в своих тестовых примерах и иметь соответствующую информацию.

PackageManager pm = getContext().getPackageManager(); 
ApplicationInfo ai = pm.getApplicationInfo(getContext().getPackageName(), PackageManager.GET_META_DATA); 
+0

Я думаю, что это могло бы сделать трюк. К сожалению, вы будете загружать все приложение, если вы подклассируете ApplicationTestCase, что очень трудоемко. Я думаю, что во время тестового прогона нет возможности извлекать поля метаданных, не перескакивая через обручи. Я думаю, рекомендация для разработчиков библиотек заключалась бы в том, чтобы избежать этой конструкции, чтобы позволить тестирование в клиентских приложениях. Я все равно соглашусь с этим ответом, поскольку это может быть единственный способ сделать трюк. – Paul

1

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

Так что:

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
package="com.percolate.coffee" 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

<meta-data android:name="DATABASE" android:value="coffee.db" /> 
<meta-data android:name="VERSION" android:value="2" /> 
<meta-data android:name="QUERY_LOG" android:value="true" /> 
<meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.percolate" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:name="com.orm.SugarApp"> 
    <activity 
     android:name=".activity.CoffeeTypeListViewActivity" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 

      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 


    <activity 
     android:name=".activity.CoffeeTypeDetailedViewAcitivity" 
     android:label="@string/title_activity_coffee_type_detailed_view_acitivity" 
     android:parentActivityName=".activity.CoffeeTypeListViewActivity"> 

    </activity> 
    <!-- SERVICES --> 
    <service 
     android:name="com.octo.android.robospice.Jackson2SpringAndroidSpiceService" 
     android:exported="false"/> 
    <service 
     android:name="com.octo.android.robospice.spicelist.okhttp.OkHttpBitmapSpiceService" 
     android:exported="false"/> 

</application> 

становится этим:

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
package="com.percolate.coffee" 
xmlns:android="http://schemas.android.com/apk/res/android"> 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

<meta-data android:name="DATABASE" android:value="coffee.db" /> 
<meta-data android:name="VERSION" android:value="2" /> 
<meta-data android:name="QUERY_LOG" android:value="true" /> 
<meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.percolate" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:name="com.orm.SugarApp"> 
    <activity 
     android:name=".activity.CoffeeTypeListViewActivity" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 

      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 


    <activity 
     android:name=".activity.CoffeeTypeDetailedViewAcitivity" 
     android:label="@string/title_activity_coffee_type_detailed_view_acitivity" 
     android:parentActivityName=".activity.CoffeeTypeListViewActivity"> 

    </activity> 
    <!-- SERVICES --> 
    <service 
     android:name="com.octo.android.robospice.Jackson2SpringAndroidSpiceService" 
     android:exported="false"/> 
    <service 
     android:name="com.octo.android.robospice.spicelist.okhttp.OkHttpBitmapSpiceService" 
     android:exported="false"/> 

</application> 

+3

Я думаю, что была ошибка копирования. Вероятно, он должен содержать поля метаданных в теге Paul

+0

ya ... но но работает..отчет – user2486322

Смежные вопросы