IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tests et Performance Java Discussion :

Mocker le comportement de Class.forName()


Sujet :

Tests et Performance Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Mocker le comportement de Class.forName()
    Bonjour,

    Avant d'exposer le souci (même si le titre en dit long) voici la fonctionnalité que je souhaite tester : la fonction renvoi Vrai si le fichier passé en paramètre est un fichier .class et si il extends Plugin.class.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class FileNameFilter {
      public boolean accept(File file) {
        String fileName = file.getName();
        try {
          return (fileName.endsWith(".class") 
                    && Class.forName(fileName).isAssignableFrom(Plugin.class));
        } catch (ClassNotFoundException e) {
          return false;
        }
      }
    }
    Jusque là rien de sorcier, j'ai mocké le fichier à passer en paramètre de la fonction et j'ai défini la valeur retourné par la fonction .getName() mais ça coince au moment de mocker Class.forName().
    En effet, Mockito ne semble pas capable de redéfinir le comportement de cette classe, ce qui entraine une levée d'exception lors de l'appel à la méthode...

    J'ai cherché du côté de PowerMock sans trouver de solution. J'en arrive à me dire que je vais devoir faire l'impasse sur le test de cette fonctionnalité, simple certe, mais abandonner le test de la première chose qu'on code c'est pas terrible je trouve :s

    Avez vous des idées/solutions/pistes afin que je puisse quand meme tester ces quelques lignes de codes ?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    1) Réponse à la question
    Il n'est pas possible de mocker une classe standard de Java (en tout cas en runtime).

    Je ne sais pas si Mockito supporte la modification du bytecode existant, mais avec AspectJ la modification du bytecode peut se faire sur une classe compilée.
    Pour des besoins de test, j'ai déjà modifier les classes de "rt.jar" (jar qui contient les classes standards de la JVM) et ça marche très bien si on met les dépendances dans le bootstrap classpath ou bien directement dans les répertoires de la JVM.

    2) Problème conceptuel
    A mon avis ta fonction ne marchera jamais.
    Le nom du fichier sera par exemple "Toto.class" pour une classe "com.developpez.grayfox27.6026902.Toto"

    Penches toi plutôt vers des système comme OSGi pour gérer des plugins ;-)

    Eventuellement tu peux essayer de charger la classe dans le classloader de ton choix.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. Recupérer une classe interne avec Class.forName
    Par Pragmateek dans le forum Général Java
    Réponses: 4
    Dernier message: 24/02/2008, 20h53
  2. Réponses: 14
    Dernier message: 22/02/2008, 19h01
  3. Class.forName() sur nom de classe "court" ?
    Par Yannick_from_31 dans le forum Langage
    Réponses: 5
    Dernier message: 23/01/2008, 09h03
  4. Problème avec Class.forName
    Par steftanguy dans le forum JDBC
    Réponses: 4
    Dernier message: 14/08/2007, 16h24
  5. Pourquoi utiliser Class.forName().newInstance()
    Par menzlitsh dans le forum Langage
    Réponses: 4
    Dernier message: 27/07/2007, 14h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo