So greifen Sie auf Java Private-Methoden und -Felder zu

Ich habe Java für ungefähr 2 Wochen verlassen, hauptsächlich weil ich damit nicht zufrieden war, aber ich habe es eilig mit der Entwicklung, also werde ich es mit JUnit testen! Selbst wenn Sie versuchen, eine Methode oder Feldvariable zu verwenden, deren Zugriffsmodifikator Private ist, können Sie sie nicht selbstverständlich aus anderen Klassen aufrufen (^ ω ^) ...

Aber nun, ich habe viel recherchiert und herausgefunden, also werde ich es aufschreiben. Wenn Sie möchten, versuchen Sie es zu düngen.

Nutzungsumgebung: OS:Windows 10 java ver:8 IDE:eclipse 4.6 Neon

Laden Sie die Jar-Datei herunter

Externe Site (https://ja.osdn.net/projects/sfnet_junit-addons/releases/) Holen Sie sich die JAR-Datei von Junit-Addons von.

Speichern Sie es in einem schönen lokalen Verzeichnis.

Fügen wir eine Jar-Datei hinzu

Starten Sie Eclipse, klicken Sie mit der rechten Maustaste auf [Paket-Explorer] und fügen Sie ein externes Jar über [Build-Pfad] -> [Build-Pfad-Konfiguration] -> [Java-Build-Pfad] hinzu.

WS000001.JPG

Jetzt bist du bereit.

Wie sieht übrigens die API-Spezifikation aus?

http://junit-addons.sourceforge.net/junitx/util/PrivateAccessor.html

Hmmmm.

Ich weiß es überhaupt nicht.

Sag mir Guguru Sensei!

Bewegen Sie sich in einem Chaos

Bereiten Sie ein Testprogramm vor. Zunächst aus dem zu testenden Programm.

Sample.java


public class Sample {

//private Feldvariablen
	private int x = 10;

//private und statische Feldvariablen
	private static int y = 20;

//private Methode
	private String testMethod(String x){

		return x;
	}

//private und statische Methoden
	private static String testStaticMethod(String y, String z){

		return y + z;
	}

}

Bereiten Sie als Nächstes eine Klassendatei für JUnit vor.

SampleTest.java


import static org.junit.Assert.*;

import org.junit.Test;

import junitx.util.PrivateAccessor;

public class SampleTest {

	@Test
	/**
	 *Testfunktion für den Zugriff auf private Felder und Methoden
	 */
	public void privateGetField() throws Throwable {
		Sample sample = new Sample();

		try {

//Eine Methode für den Zugriff auf private Feldvariablen.
//Erstes Argument:Instanzvariable der zu testenden Klasse Zweites Argument:Name der Feldvariablen, auf die Sie zugreifen möchten
			int x = (int)PrivateAccessor.getField(sample, "x");

//Vergleichen Sie den gemessenen Wert und den erwarteten Wert durch Behauptung
			assertEquals(x,10);

//Auf private und statische Feldvariablen kann auf ähnliche Weise zugegriffen werden. Erklärung weggelassen
			int y = (int)PrivateAccessor.getField(sample, "y");
			assertEquals(y,20);


//Eine Methode für den Zugriff auf private Funktionen.
//Erstes Argument:Instanzvariable der zu testenden Klasse Zweites Argument:Feld Funktionsname, auf den Sie zugreifen möchten
//Drittes Argument:Argumenttyp Array Viertes Argument:Array von Argumentwerten
			String method_x = (String)PrivateAccessor.invoke(	sample,
																"testMethod",
																new Class[]{String.class},
																new Object[]{"private_x"});
			assertEquals(method_x,"private_x");

//Auf private und statische Funktionen kann auf die gleiche Weise zugegriffen werden. Entwickeln Sie das dritte und vierte Argument entsprechend der Anzahl der Argumenttypen
			String method_y = (String)PrivateAccessor.invoke(	sample,
																"testStaticMethod",
																new Class[]{String.class,String.class},
																new Object[]{"private_","static_y"});
			assertEquals(method_y,"private_static_y");


		} catch (NoSuchFieldException e) {

			e.printStackTrace();

		}finally{

		}
    }
}

Lauf

Tust du!

2017y02m12d_220044187.jpg

erledigt!

Bonus

Sie können auch einen Wert für eine private Feldvariable festlegen.

SampleTest.java



//Unterwegs weggelassen

	@Test
	/**
	 *Eine Funktion, die einen Wert in einer privaten Feldvariablen festlegt
	 */
	public void privateSetField(){

		Sample sample = new Sample();

		try {

//Erstes Argument: Instanzvariable der zu testenden Klasse Zweites Argument: Name der Variablen
//Drittes Argument:Wert, den Sie festlegen möchten
			PrivateAccessor.setField(sample, "x", 100);

//Überprüfen Sie, ob es eingestellt wurde!
			int get_x = (int)PrivateAccessor.getField(sample, "x");
			assertEquals(get_x,100);

		} catch (NoSuchFieldException e) {

			e.printStackTrace();

		}finally{

		}
	}


Das Ende

Recommended Posts

So greifen Sie auf Java Private-Methoden und -Felder zu
Aufrufen von Klassen und Methoden
Verwendung von Klassenmethoden [Java]
[Java] Wie man Dateien ausgibt und schreibt!
So testen Sie eine private Methode und verspotten sie teilweise in Java
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
Wie man Java SE8 Gold bekommt und studiert
[Java] Verwendung der Kalenderklasse und der Datumsklasse
[Java] So lassen Sie den privaten Konstruktor in Lombok weg
[Java] Arten von Kommentaren und wie man sie schreibt
Lesen von Java Memory Management und GC Viewer
[Java] Verweisen Sie auf und setzen Sie private Variablen mit Reflektion
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So senken Sie die Java-Version
[Java] Verwendung von Map
So deinstallieren Sie Java 8 (Mac)
[Java] Generics-Klasse und Generics-Methode
Verwendung von Java Optional
So minimieren Sie Java-Images
Wie schreibe ich einen Java-Kommentar
Verwendung der Java-Klasse
Überprüfen Sie die private Methode der Java9-Schnittstelle
[Java] Verwendung von removeAll ()
[Java] So zeigen Sie Wingdings an
Verwendung von Java Map
So legen Sie Java-Konstanten fest
Java-Methoden und Methodenüberladungen
Verwendung von Java-Variablen
[Java] So implementieren Sie Multithreading
So initialisieren Sie ein Java-Array
Bedingte Java-Verzweigung: Erstellen und Studieren von switch-Anweisungen
So trennen Sie Wörter in Namen in Klassen, Methoden und Variablen
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
[Rails] Verschiedene Unterschiede zwischen redirect_to und Render-Methode und Ausgabemethode der Render-Methode
Was ist in "Java 8 bis Java 11" passiert und wie wird eine Umgebung erstellt?
Schreiben und Notizen bei der Migration von VB zu JAVA
So entwickeln und registrieren Sie eine Sota-App in Java
Unterschiede im Umgang mit Zeichenfolgen zwischen Java und Perl
Verwendung von StringBurrer und Arrays.toString.
So lernen Sie Java Silver SE 8
Verwendung von HttpClient (Get) von Java
Informationen zu statischen und nicht statischen Java-Methoden
Verwendung von EventBus3 und ThreadMode
Java # 6 studieren (Wie man Blöcke schreibt)
So erstellen Sie einen Java-Container
So zerlegen Sie eine Java-Klassendatei
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
[Verarbeitung × Java] Verwendung von Variablen
So verbinden Sie Heroku und Sequel
So dekompilieren Sie eine Java-Klassendatei
So konvertieren Sie LocalDate und Timestamp
[JavaFX] [Java8] Verwendung von GridPane