34 votes

Comment simuler des méthodes statiques ?

Je suis novice en matière d'objets fantaisie, mais je comprends que mes classes doivent implémenter des interfaces afin de pouvoir les utiliser comme objets fantaisie.

Le problème que je rencontre est que dans ma couche d'accès aux données, je veux avoir des méthodes statiques, mais je ne peux pas mettre une méthode statique dans une interface.

Quelle est la meilleure façon de contourner ce problème ? Dois-je me contenter d'utiliser les méthodes d'instance (ce qui ne me semble pas correct) ou existe-t-il une autre solution ?

26voto

Rick Minerich Points 2407

J'ai trouvé un blog via google avec d'excellents exemples sur la manière de procéder :

  1. Refactoriser la classe pour qu'elle soit une classe d'instance et implémente une interface.

    Vous avez déjà déclaré que vous ne voulez pas le faire.

  2. Utiliser une classe d'instance enveloppante avec des délégués pour les membres des classes statiques.

    En procédant ainsi, vous pouvez simuler une interface statique via des délégués.

  3. Utilisez une classe d'instance enveloppante avec des membres protégés qui appellent la classe statique.

    Il s'agit probablement de l'élément le plus facile à simuler/gérer sans refactoring, car il peut simplement être hérité et étendu.

26voto

Jon Skeet Points 692016

Oui, vous utilisez des méthodes d'instance. Les méthodes statiques disent essentiellement : "Il y a une façon d'accomplir cette fonctionnalité - elle n'est pas polymorphe". Le mocking repose sur le polymorphisme.

Maintenant, si vos méthodes statiques ne se soucient logiquement pas de l'implémentation que vous utilisez, elles pourraient être capables de prendre les interfaces comme paramètres, ou peut-être de fonctionner sans interagir du tout avec l'état - mais autrement vous devriez utiliser les instances (et probablement l'injection de dépendance pour tout relier).

22voto

Grundlefleck Points 29486

J'utiliserais un modèle méthode-objet. Avoir une instance statique de ceci, et l'appeler dans la méthode statique. Il devrait être possible de sous-classer pour les tests, en fonction de votre framework de mocking.

c'est-à-dire dans votre classe avec la méthode statique have :

private static final MethodObject methodObject = new MethodObject();

public static void doSomething(){
    methodObject.doSomething();
}

et votre objet méthode peut être un objet très simple, facilement testé :

public class MethodObject {
    public void doSomething() {
        // do your thang
    }
}

5voto

Carlton Jenke Points 2483

Vous essayez peut-être de tester à un point de départ trop profond. Il n'est pas nécessaire de créer un test pour tester chaque méthode individuellement ; les méthodes privées et statiques doivent être testées en appelant les méthodes publiques qui appellent à leur tour les méthodes privées et statiques.

Disons que votre code est le suivant :

public object GetData()
{
 object obj1 = GetDataFromWherever();
 object obj2 = TransformData(obj1);
 return obj2;
} 
private static object TransformData(object obj)
{
//Do whatever
}

Vous n'avez pas besoin d'écrire un test contre la méthode TransformData (et vous ne pouvez pas). Écrivez plutôt un test pour la méthode GetData qui teste le travail effectué dans TransformData.

4voto

David B Points 53123

Utilisez des méthodes d'instance lorsque cela est possible.

Utilisez les Public static Func [T, U] (références de fonctions statiques qui peuvent être substituées aux fonctions fantaisie) lorsque les méthodes d'instance ne sont pas possibles.

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