Comment accéder aux méthodes et champs Java Private

J'ai quitté Java pendant environ 2 semaines, principalement parce que je n'étais pas satisfait, mais je suis pressé pour le développement, donc je vais le tester avec JUnit! Même si vous essayez d'utiliser une méthode ou une variable de champ dont le modificateur d'accès est Private, vous ne pouvez pas l'appeler depuis d'autres classes comme une évidence (^ ω ^) ...

Mais bon, j'ai fait beaucoup de recherches et je l'ai découvert, alors je vais l'écrire. Si vous le souhaitez, essayez de le fertiliser.

environnement d'utilisation: OS:Windows 10 java ver:8 IDE:eclipse 4.6 Neon

Téléchargez le fichier Jar

Site externe (https://ja.osdn.net/projects/sfnet_junit-addons/releases/) Récupérez le fichier jar de junit-addons à partir de.

Enregistrez-le dans un joli répertoire local.

Ajoutons un fichier Jar

Démarrez eclipse, faites un clic droit sur [Package Explorer] et ajoutez un Jar externe depuis [Build Path] -> [Build Path Configuration] -> [java Build Path].

WS000001.JPG

Vous êtes maintenant prêt.

Au fait, à quoi ressemble la spécification de l'API?

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

Hmmmm.

Je ne sais pas du tout.

Dites-moi Guguru Sensei!

Bouger dans le désordre

Préparez un programme de test. Tout d'abord, du programme à tester.

Sample.java


public class Sample {

//variables de champ privé
	private int x = 10;

//variables de champ privées et statiques
	private static int y = 20;

//méthode privée
	private String testMethod(String x){

		return x;
	}

//méthodes privées et statiques
	private static String testStaticMethod(String y, String z){

		return y + z;
	}

}

Ensuite, préparez un fichier de classe pour JUnit.

SampleTest.java


import static org.junit.Assert.*;

import org.junit.Test;

import junitx.util.PrivateAccessor;

public class SampleTest {

	@Test
	/**
	 *Fonction de test pour accéder aux champs et méthodes privés
	 */
	public void privateGetField() throws Throwable {
		Sample sample = new Sample();

		try {

//Une méthode pour accéder aux variables de champ privé.
//Premier argument:Variable d'instance de la classe testée Second argument:Nom de la variable de champ à laquelle vous souhaitez accéder
			int x = (int)PrivateAccessor.getField(sample, "x");

//Comparer la valeur mesurée et la valeur attendue par assertion
			assertEquals(x,10);

//Les variables de champ privées et statiques sont accessibles de la même manière. Explication omise
			int y = (int)PrivateAccessor.getField(sample, "y");
			assertEquals(y,20);


//Une méthode pour accéder aux fonctions privées.
//Premier argument:Variable d'instance de la classe testée Second argument:Nom de la fonction de champ à laquelle vous souhaitez accéder
//Troisième argument:Tableau de type d'argument Quatrième argument:Tableau de valeurs d'argument
			String method_x = (String)PrivateAccessor.invoke(	sample,
																"testMethod",
																new Class[]{String.class},
																new Object[]{"private_x"});
			assertEquals(method_x,"private_x");

//Les fonctions privées et statiques sont accessibles de la même manière. Concevez les troisième et quatrième arguments en fonction du nombre de types d'arguments
			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{

		}
    }
}

Courir

Doya!

2017y02m12d_220044187.jpg

l'a fait!

prime

Vous pouvez également définir une valeur pour une variable de champ privé.

SampleTest.java



//Omis en chemin

	@Test
	/**
	 *Une fonction qui définit une valeur dans une variable de champ privé
	 */
	public void privateSetField(){

		Sample sample = new Sample();

		try {

//Premier argument: variable d'instance de la classe testée Deuxième argument: nom de la variable
//Troisième argument:Valeur que vous souhaitez définir
			PrivateAccessor.setField(sample, "x", 100);

//Vérifiez s'il a été défini!
			int get_x = (int)PrivateAccessor.getField(sample, "x");
			assertEquals(get_x,100);

		} catch (NoSuchFieldException e) {

			e.printStackTrace();

		}finally{

		}
	}


La fin

Recommended Posts

Comment accéder aux méthodes et champs Java Private
Comment appeler des classes et des méthodes
Comment utiliser les méthodes de classe [Java]
[Java] Comment sortir et écrire des fichiers!
Comment tester une méthode privée et la simuler partiellement en Java
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Comment obtenir et étudier Java SE8 Gold
[Java] Comment utiliser la classe Calendar et la classe Date
[Java] Comment omettre le constructeur privé dans Lombok
[Java] Types de commentaires et comment les rédiger
Comment lire la gestion de la mémoire Java et GC Viewer
[Java] Se référer et définir des variables privées avec réflexion
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment abaisser la version java
[Java] Comment utiliser Map
Comment désinstaller Java 8 (Mac)
[Java] Classe générique et méthode générique
Comment utiliser java Facultatif
Comment réduire les images Java
Comment rédiger un commentaire java
Comment utiliser la classe Java
Vérifier la méthode privée de l'interface Java9
[Java] Comment utiliser removeAll ()
[Java] Comment afficher les Wingdings
Comment utiliser Java Map
Comment définir des constantes Java
Méthodes Java et surcharges de méthodes
Comment utiliser les variables Java
[Java] Comment implémenter le multithreading
Comment initialiser un tableau Java
Branchement conditionnel Java: comment créer et étudier des instructions de commutation
Comment séparer les mots dans les noms dans les classes, les méthodes et les variables
Différence entre Java et JavaScript (comment trouver la moyenne)
[Rails] Différentes différences entre redirect_to et méthode de rendu et méthode de sortie de la méthode de rendu
Que s'est-il passé dans «Java 8 to Java 11» et comment créer un environnement
Comment écrire et noter lors de la migration de VB vers JAVA
Comment développer et enregistrer une application Sota en Java
Différences dans la gestion des chaînes entre Java et Perl
Comment utiliser StringBurrer et Arrays.toString.
Comment étudier Java Silver SE 8
Comment utiliser HttpClient de Java (Get)
À propos des méthodes Java statiques et non statiques
Comment utiliser EventBus3 et ThreadMode
Étudier Java # 6 (Comment écrire des blocs)
Comment créer un conteneur Java
Comment désassembler un fichier de classe Java
Comment utiliser HttpClient de Java (Post)
[Java] Comment utiliser la méthode de jointure
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
[Traitement × Java] Comment utiliser les variables
Comment connecter Heroku et Sequel
Comment décompiler un fichier de classe Java
Comment convertir LocalDate et Timestamp
[JavaFX] [Java8] Comment utiliser GridPane