28 votes

FragmentActivity ne peut pas être testé via ActivityInstrumentationTestCase2

J'ai un problème d'exécution android tests d'unité sur android applications qui utilisent l'a récemment publié Fragment de support de l'API. Lorsque le test est exécuté avec une FragmentActivity l'erreur suivante s'affiche dans le journal et la classe ne parvient pas à charger. Lorsqu'il est exécuté sur un cours identique, mais un dérivé de l'Activité, le test fonctionne très bien. Les deux classes fonctionnent correctement, comme les applications! Ce qui signifie que lorsque tout simplement invoqué ils afficheront leur disposition et leur fonction correctement. Le support de pot est une partie de la construction de chemin d'accès et inclus dans le projet.

Le problème que j'ai, c'est que la seule façon d'utiliser les fragments (et le soutien pre3.0 android) est d'utiliser FragmentActivity, mais si cela exclut les tests automatisés, à quoi bon cette bibliothèque.

4-05 18:00:11.276: WARN/dalvikvm(1095): Class resolved by unexpected DEX: Lcom/example/android/app/FragmentLayoutSupport;(0x406351a0):0x12e5c8 ref [Landroid/support/v4/app/FragmentActivity;] Landroid/support/v4/app/FragmentActivity;(0x406351a0):0x12e440
04-05 18:00:11.276: WARN/dalvikvm(1095): (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification)
04-05 18:00:11.286: WARN/dalvikvm(1095): Unable to resolve superclass of Lcom/example/android/app/FragmentLayoutSupport; (49)
04-05 18:00:11.286: WARN/dalvikvm(1095): Link of class 'Lcom/example/android/app/FragmentLayoutSupport;' failed
04-05 18:00:11.286: ERROR/dalvikvm(1095): Could not find class 'com.example.android.app.FragmentLayoutSupport', referenced from method com.example.android.app.test.FrameLayoutTest.<init>
04-05 18:00:11.286: WARN/dalvikvm(1095): VFY: unable to resolve const-class 131 (Lcom/example/android/app/FragmentLayoutSupport;) in Lcom/example/android/app/test/FrameLayoutTest;

Voici le code que j'ai construit pour illustrer le problème. Le cas de test essaie simplement de créer une instance de la classe sous test:

FrameLayoutTest.java    
public class FrameLayoutTest extends
            ActivityInstrumentationTestCase2<FragmentLayoutSupport> {
        public FrameLayoutTest() {
            super(FragmentLayoutSupport.class);
        }

    public void testActivityTestCaseSetUpProperly() {
        assertNotNull("activity should be launched successfully", getActivity());
    }
}

Les deux classes que j'ai créé sont comme suit et fragment_layout est vide LinearLayout:

FrameLayout.java
public class FragmentLayout extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_layout);
    }
}

Et

FragmentLayoutSupport.java
public class FragmentLayoutSupport extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fragment_layout);
    }
}

49voto

Alec B. Plumb Points 1685

J'ai passé la moitié de la nuit sur ce, et a finalement trouvé une solution. La clé est la suivante:

04-05 18:00:11.276, (Lcom/example/android/app/FragmentLayoutSupport; had used a different Landroid/support/v4/app/FragmentActivity; during pre-verification). 

Le problème est que l'android-support-v4.jar qui vous aide dans votre projet de test est différent de celui dans votre projet d'application. Supprimer toutes les références à android-support-v4.jar à partir de votre projet de test. Ensuite, allez à votre demande les Propriétés du projet->Java Build Path->de l'Ordre et de l'Exportation et de vérifier android-support-v4.jar à l'exportation. Maintenant, les deux projets seront à l'aide de la même bibliothèque, et dalvik ne me plaindrai pas.

3voto

colabug Points 815

La réponse d'IntelliJ par Rupert ne m'a pas permis d'arriver jusque-là. J'ai résolu cela en exportant le pot comme la réponse Eclipse suggérée.

Fichier> Structure du projet> Modules> [sélectionnez votre application principale]> onglet dépendances> cochez la case d'exportation à côté du pot de support

Structure du projet IntelliJ

2voto

Rupert Bates Points 1690

Pour tous les utilisateurs IntelliJ qui rencontrent ce problème, le correctif équivalent consiste à définir la portée de votre dépendance sur «Fourni» comme suit:

Fichier> Structure du projet> Modules> [sélectionnez votre application de test]> onglet dépendances> sélectionnez "Fourni" dans le menu déroulant de la portée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X