2011-03-24 4 views
0

J'ai une méthode qui retourne une instance d'une classe privée et j'ai besoin d'accéder à ses méthodes à partir d'un paquet différent pour le test unitaire. Ces classes vivent dans le même fichier. Il va comme ceci:La méthode publique renvoie une instance de classe privée dans Java?

fichier: A.java

public class A{ 
    B b; 
    public B getB(){ 
     return b; 
    } 
    public setB(B b){ 
     this->b = b; 
    } 
} 

class B{ 
    C c; 
    public C getC(){ 
     return c; 
    } 
    public setC(C c){ 
     this->c = c; 
    } 
} 

class C{ 
    public int getInt(){ 
     return 1; 
    } 
} 

Alors ... Au fond la question est: sont l'une des méthodes B ou C accessible en quelque sorte? Suis-je obligé de placer B et C dans des fichiers différents et de les rendre publics pour accomplir cela?

+0

Dans la plupart des cas, vous devriez en tenir à 1 classe par fichier. Quelle est la raison impérieuse d'inclure 'B' et' C' dans 'A.class' ici? –

+1

Aussi 'this-> b' et' this-> c' n'est pas une syntaxe Java valide. – anubhava

Répondre

0

Oui, vous pouvez utiliser la réflexion pour appeler toutes les méthodes dans tous les cas de B ou C partout, mais, de mon POV, est un hack plutôt qu'une technique.

Sinon, la classe B et C ne sont pas exposés en dehors de votre A.class.

1

Il est recommandé de TOUJOURS placer le code source de chaque classe de niveau supérieur dans un fichier distinct. Si vous ne le faites pas, vous peut rencontrer des difficultés avec la compilation, etc.

Il y a une autre question de savoir si les classes B et C doivent être public afin que vous puissiez créer des tests unitaires. Je dirais que c'est probablement une bonne idée, mais il y a deux façons de contourner cela:

  • Si vous mettez les tests unitaires dans le même package Java que les classes A, B et C, le les classes (et leurs méthodes) seront visibles pour les tests unitaires.

  • Vous pouvez exposer les méthodes en créant public sous-classes de B et C à des fins de test. Ceux-ci doivent être déclarés dans le même paquet Java que les classes A, B et C.

  • Vous pouvez créer des instances de B et C et d'appeler des méthodes à l'aide de la réflexion. (Mais cela est beaucoup de travail pour un test unitaire, et je ne le recommanderais pas!)

Notez que si vous avez des arborescences de sources séparées pour votre code produit et votre code de test, vous pouvez mettre essai classes dans le même paquet que A, B et C sans mélanger les bases de code. Lorsque vous créez pour la production/publication, vous laissez simplement les classes dans l'arbre de test hors de la construction.


Par ailleurs, dans votre exemple les classes B et C sont « paquet privé » plutôt que « privé ». L'unité testant une vraie classe "privée" est un problème totalement différent.

0

Techniquement, les classes sont protégées; Aussi longtemps que les classes qui appellent getB et getC sont dans le même paquet, vous n'aurez aucun problème. Si d'un autre paquet vous avez essayé d'exécuter GetB GetC, vous verrez des problèmes car votre autre paquet ne pourra pas accéder à la classe réelle.

Ici TestProt NE PEUT PAS être importé car il est protégé dans le package tester2. FILE1:

package tester; 
import tester2.Test; 
public class Testing { 
    public Testing() { 
    Test t = new Test(); 
    TestProt p = t.prot(); 
    } 
} 

FICHIER2:

package tester2; 
public class Test { 
    public TestProt prot() { 
    return new TestProt(); 
    } 
} 

class TestProt{ 
    public TestProt() { 
    } 
} 
Questions connexes