Java >> Java tutorial >  >> Tag >> private

Hvordan tester jeg en privat funktion eller en klasse, der har private metoder, felter eller indre klasser?

Opdatering:

Omkring 10 år senere er den måske bedste måde at teste en privat metode, eller et hvilket som helst utilgængeligt medlem på, via @Jailbreak fra Manifold-rammen.

@Jailbreak Foo foo = new Foo();
// Direct, *type-safe* access to *all* foo's members
foo.privateMethod(x, y, z);
foo.privateField = value;

På denne måde forbliver din kode typesikker og læsbar. Ingen designkompromiser, ingen overeksponeringsmetoder og felter af hensyn til testene.

Hvis du har noget af en arv Java applikation, og du ikke må ændre synligheden af ​​dine metoder, er den bedste måde at teste private metoder på ved at bruge refleksion.

Internt bruger vi hjælpere til at få/indstille private og private static variabler samt påkalde private og private static metoder. Følgende mønstre vil lade dig gøre stort set alt relateret til de private metoder og felter. Du kan selvfølgelig ikke ændre private static final variabler gennem refleksion.

Method method = TargetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);
return method.invoke(targetObject, argObjects);

Og for felter:

Field field = TargetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);

Bemærkninger:
1. TargetClass.getDeclaredMethod(methodName, argClasses) lader dig se på private metoder. Det samme gælder for getDeclaredField .
2. setAccessible(true) er påkrævet for at lege med menige.


Den bedste måde at teste en privat metode på er via en anden offentlig metode. Hvis dette ikke kan lade sig gøre, er en af ​​følgende betingelser sandt:

  1. Den private metode er død kode
  2. Der er en designlugt i nærheden af ​​den klasse, du tester
  3. Den metode, du prøver at teste, bør ikke være privat

Når jeg har private metoder i en klasse, der er så komplicerede, at jeg føler behov for at teste de private metoder direkte, er det en kodelugt:min klasse er for kompliceret.

Min sædvanlige tilgang til at løse sådanne problemer er at tease en ny klasse, der indeholder de interessante bidder. Ofte kan denne metode og de felter, den interagerer med, og måske kan en anden metode eller to ekstraheres ind i en ny klasse.

Den nye klasse afslører disse metoder som 'offentlige', så de er tilgængelige for enhedstestning. De nye og gamle klasser er nu både enklere end den oprindelige klasse, hvilket er fantastisk for mig (jeg skal holde tingene enkle, ellers farer jeg vild!).

Bemærk, at jeg ikke foreslår, at folk opretter klasser uden at bruge deres hjerne! Pointen her er at bruge enhedstestens kræfter til at hjælpe dig med at finde gode nye klasser.


Java tag