No enclosing instance of the type A is accessible in scope

No enclosing instance of the type A is accessible in scope - Java - Programmation

Marsh Posté le 16-09-2010 à 12:24:54    

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
Reply

Marsh Posté le 16-09-2010 à 12:24:54   

Reply

Marsh Posté le 16-09-2010 à 14:58:48    

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();

Reply

Marsh Posté le 16-09-2010 à 15:29:24    

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.

Reply

Marsh Posté le 16-09-2010 à 15:49:04    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed