Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1562 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  No enclosing instance of the type A is accessible in scope

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

No enclosing instance of the type A is accessible in scope

n°2023273
cimourdain
Posté le 16-09-2010 à 12:24:54  profilanswer
 

Bonjour,
 
Voici une classe avec laquelle je travaille:
 

Code :
  1. package com;
  2. public class A {
  3. protected class InA {
  4.  InA() {
  5.  }
  6.  public void meth1() {
  7.   meth2();
  8.  }
  9.  protected void meth2() {
  10.  }
  11. }
  12. }


 
Cette classe existait déjà, le seul refactoring que j'ai fait c'est isoler du code dans meth2(), qui était dans meth1(). Au moment ou tout ce code a été écrit, aucun test unitaire n'a été écrit. Je dois donc en faire. Je veux faire un test unitaire sur meth1() et comme je ne peux pas utiliser la méthode meth2() pour les tests unitaires (pas le même comportement), il faut que je la mocke pour lui faire renvoyer ce qui est attendu. Ce qui compte c'est le test de meth1().
 
 
Voici une version de ma classe de test qui ne marche pas:
 

Code :
  1. package com;
  2. import com.A.InA;
  3. public class TestA {
  4. protected class MockInA extends InA {
  5.  public MockInA() {
  6.   super(); // No enclosing instance of the type A is accessible in scope
  7.  }
  8.  protected void meth2() {
  9.  }
  10. }
  11. }


 
Je ne comprends pas ce No enclosing instance of the type A is accessible in scope (erreur sur super)
 
Voici comment je contourne le problème:
 

Code :
  1. package com;
  2. import com.A.InA;
  3. public class TestA2 {
  4. protected class Englobe extends A {
  5.  protected class MockInA extends InA {
  6.   public MockInA() {
  7.    super(); // OK
  8.   }
  9.   protected void meth2() {
  10.   }
  11.  }
  12. }
  13. }


 
 
J'aimerais bien comprendre ce qui se passe... Pourquoi je dois encore rajouter une classe bidon pour englober (Englobe) ?
Merci d'avance pour vos explications.


Message édité par cimourdain le 16-09-2010 à 12:25:53
mood
Publicité
Posté le 16-09-2010 à 12:24:54  profilanswer
 

n°2023308
Riokmij
Blink and you're dead
Posté le 16-09-2010 à 14:58:48  profilanswer
 

Pour les explications, cette page explique bien les choses (surtout la dernière partie) : http://download.oracle.com/javase/ [...] ested.html
 
Le fait que InA ne soit pas static fait que chaque instance de InA doit obligatoire être liée à une instance de A (ce qui est assez logique, vu qu'on peut accéder aux données non statiques de A depuis InA)
 
Au passage, j'ai appris quelque chose, je ne connaissais pas cette syntaxe (qui doit surement t'aider à résoudre ton problème) :

Code :
  1. OuterClass.InnerClass innerObject = outerObject.new InnerClass();

n°2023320
cimourdain
Posté le 16-09-2010 à 15:29:24  profilanswer
 

Oui je connaissais déjà ca, mais je pense que mon problème n'est pas exactement celui la. Je ne cherche pas a instancier une inner class.

n°2023326
Riokmij
Blink and you're dead
Posté le 16-09-2010 à 15:49:04  profilanswer
 

Ok, c'est peut-être pas exactement ton problème, mais ça revient quand même plus ou moins à la même chose : ton code qui ne marche pas cherche à construire une instance d'une sous-classe de InA qui n'a pas accès à une instance de A.
 
Tu dois pouvoir éviter de passer par ta classe qui englobe en utilisant une classe anonyme, un truc du genre :  

Code :
  1. A a = new A();
  2. InA mockA = a.new InA() {
  3.    protected void meth2() {
  4.  
  5.    }
  6. };


 
 
Mais dans tous les cas, il faut une instance de A quelque part.
 
EDIT : mais effectivement, Java pourrait te laisser déclarer ta classe MockA comme tu l'as faite et ne râler que si on essaie de l'instancier directement, sans passer par une instance de A. Je vois pas vraiment de raison qui justifie ce comportement.


Message édité par Riokmij le 16-09-2010 à 15:52:04

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  No enclosing instance of the type A is accessible in scope

 

Sujets relatifs
Récupérer un type de fichier sur lecteurs voulusType d'un template
Type erasure et accesseursImpossible de copier/coller un path dans un input type file sous FF3
Erreur 13 :incompatibilité typeServeur. Code PHP Ne Se Lance Pas. Le Propio A Bridé le PHP
Macro: Changer le type du fichier dans Enregistrer sousConversion de type c pour une utilisation de dll VBA
Recherche editeur C type Nassi-Schneidermanget file content type
Plus de sujets relatifs à : No enclosing instance of the type A is accessible in scope


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR