Hoe Unit-test eigen methodes in Java en Kotlin

GOVIND DIXIT
GOVIND DIXIT

Volgen

Jul 23, 2019 · 4 min lezen

Ja, Dit is de miljoen dollar vraag. Hoe test je private methoden?

moet een ontwikkelaar de private methoden in zijn codebase testen? of ze op het vertrouwen van publieke methoden achterlaten is een manier. Elke ontwikkelaar heeft zijn eigen mening dat de vraag of we ze daadwerkelijk testen of niet. Dus, In een notendop, de vraag werd gereduceerd tot is ” bestaat er een goede aanpak die we kunnen proberen voor deze baan?”

So, hier zijn alle mogelijke opties beschikbaar voor een ontwikkelaar om private methoden van zijn Java / kotlin gebaseerde Apps te testen in 2019:

  1. test geen private methoden 😜(geen wortels, geen zure druiven)
  2. Geef de methoden publieke toegang 😒 (Nee, ik doe dit niet het is tegen codering praktijken. Ik ben een goede ontwikkelaar, Ik volg best practices)
  3. gebruik een geneste testklasse 😒 (dit is niet goed om de productiecode te mengen met de testcode. Moet ik nogmaals vermelden dat ik een goede ontwikkelaar ben en ik volg alleen best practices)
  4. gebruik Java reflectie 😃(Ja, dit lijkt interessant Ik ben in voor het)

ondanks de algemene overtuiging dat het eigenlijk mogelijk is om toegang te krijgen tot privé velden en methoden van andere klassen via Java reflectie. Het is niet eens zo moeilijk. Dit kan erg handig zijn tijdens het testen van eenheden.

Opmerking: Dit werkt alleen bij het uitvoeren van de code als een zelfstandige Java-toepassing, zoals u doet met unit tests en reguliere toepassingen. Als je dit probeert te doen in een Java Applet, zul je moeten rommelen met de SecurityManager. Maar omdat dat niet iets is wat je heel vaak hoeft te doen, is het tot nu toe uit deze tekst weggelaten.

Methodeparameter reflectie ondersteuning werd toegevoegd in Java 8. Simpel gezegd, het biedt ondersteuning voor het verkrijgen van de namen van parameters tijdens runtime.

om toegang te krijgen tot een privéveld moet u de Class.getDeclaredField(String name) of Class.getDeclaredFields() methode aanroepen. De methoden Class.getField(String name) en Class.getFields() geven alleen publieke velden terug, dus ze zullen niet werken. Hier is een eenvoudig voorbeeld van een klasse met een privé veld, en daaronder de code om toegang te krijgen tot dat veld via Java reflectie:

public class PrivateObject {private String privateString = null;public PrivateObject(String privateString) {
this.privateString = privateString;
}
}PrivateObject privateObject = new PrivateObject("The Private Value");Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");privateStringField.setAccessible(true);String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

Dit code voorbeeld zal de tekst "fieldValue = The Private Value”, wat de waarde is van het privé veld privateString van de PrivateObject de instantie die aan het begin van het codevoorbeeld is aangemaakt.

merk op dat de methodePrivateObject.class.getDeclaredField("privateString")wordt gebruikt. Het is deze methode aanroep die het privéveld retourneert. Deze methode geeft alleen gedeclareerde velden terug in die specifieke klasse, niet gedeclareerde velden in superklassen.

Let ook op de vetgedrukte regel. Door Field.setAcessible(true) aan te roepen schakelt u de toegangscontroles uit voor deze specifieke Field instantie, alleen voor reflectie. Nu kunt u toegang tot het zelfs als het privé, beschermd of pakket scope, zelfs als de beller is geen onderdeel van die scopes. U kunt het veld nog steeds niet openen met de normale code. De compiler staat het niet toe.

toegang tot Private methoden

om toegang te krijgen tot een private methode moet u de Class.getDeclaredMethod(String name, Class parameterTypes) of Class.getDeclaredMethods() methode aanroepen. De methoden Class.getMethod(String name, Class parameterTypes) en Class.getMethods() geven alleen publieke methoden terug, dus ze zullen niet werken.

Hier is een eenvoudig voorbeeld van een klasse met een private methode, en daaronder de code om toegang te krijgen tot die methode via Java reflectie:

public class PrivateObject {private String privateString = null;public PrivateObject(String privateString) {
this.privateString = privateString;
}private String getPrivateString(){
return this.privateString;
}
}PrivateObject privateObject = new PrivateObject("The Private Value");Method privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);privateStringMethod.setAccessible(true);String returnValue = (String)
privateStringMethod.invoke(privateObject, null);System.out.println("returnValue = " + returnValue);

dit codevoorbeeld zal de tekst "returnValue = The Private Value” afdrukken, wat de waarde is die wordt geretourneerd met de methode getPrivateString() wanneer gebruikt op de PrivateObject de instantie die aan het begin van het codevoorbeeld is gemaakt.

merk op dat de methodePrivateObject.class.getDeclaredMethod("privateString")wordt gebruikt. Het is deze methode aanroep die de private methode retourneert. Deze methode geeft alleen de in die specifieke klasse gedeclareerde methoden terug, niet de in een superklasse gedeclareerde methoden.

Let ook op de vetgedrukte regel. Door Method.setAcessible(true) aan te roepen schakelt u de toegangscontroles uit voor deze specifieke Method instantie, alleen voor reflectie. Nu kunt u toegang tot het zelfs als het privé, beschermd of pakket scope, zelfs als de beller is geen onderdeel van die scopes. U kunt nog steeds geen toegang tot de methode met behulp van de normale code. De compiler staat het niet toe.

laten we deze kennis uitproberen op een productieniveau code.
hier is de klasse die enkele private methoden bevat die we willen testen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.