[JAVA] Comment se moquer d'un appel de super méthode dans PowerMock

introduction

Dans JUnit utilisant Mockito et Powermock, j'ai dû me moquer du traitement de la classe parente en utilisant super, alors j'en ai pris note. Si vous le recherchez, vous pouvez voir que vous pouvez utiliser PowerMockito.suppress (), mais si vous utilisez suppress (), il ne sera ignoré et vous devriez retourner l'objet fictif que vous attendiez. Il était dans un état où le traitement ultérieur de JUnit n'a pas pu être exécuté avec succès.

Classe testée

L'exemple de code est illustré ci-dessous. La classe DTO est omise.

Classe parent

public class Parent {

	public OutputDto execute (InputDto input) {
		System.out.println("Parent#execute()");
		OutputDto out = new OutputDto();
		out.setText(input.getText());
		return out;
	}
}

Classe enfant

public class Child extends Parent {

	public OutputDto execute (InputDto input) {
		System.out.println("Child#execute()");
		OutputDto out = super.execute(input);
		out.setText(out.getText()+" updated in Child.");
		return out;
	}
}

Le fait est que dans la classe enfant, super.execute () est fait et la valeur de retour est attendue.

Classe de test JUnit

@RunWith(PowerMockRunner.class)
@PrepareForTest({Parent.class})//Spécifier le parent
public class MockSuperTest {

	//Classe testée
	@InjectMocks
	private Child child;

	@Before
	public void setUp() throws Exception {
		MockitoAnnotations.initMocks(this);
	}

	@Test
	public void testExecute1() {
		//Préparation des données d'entrée
		InputDto input = new InputDto();
		input.setText("hello");
		OutputDto result = new OutputDto();
		result.setText("hello updated in Child.");

		try {
			Method method = child.getClass().getMethod("execute", InputDto.class);
			PowerMockito.replace(method).with(
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						System.out.println("replaced execute()!!");
						return result;
					}
				});
		} catch (Exception e) {
			e.printStackTrace();
			fail();
		}

		OutputDto testOut = child.execute(input);
		assertEquals(result.getText(), testOut.getText());
	}
}

Résultat d'exécution

Lorsque vous exécutez le JUnit ci-dessus,

Child#execute()
replaced execute()!!

Ensuite, après avoir appelé ʻexecute () de la classe enfant, super.execute () est remplacé par le contenu spécifié par PowerMockito.replace ()`.

Au fait,

@PrepareForTest({Child.class})//Spécifiez un enfant
public class MockSuperTest {

Si vous spécifiez la place dans la classe enfant, le résultat sera

replaced execute()!!

Modifiez directement la classe voisine ʻexecute () `. Bien sûr, si vous l'exécutez normalement

Child#execute()
Parent#execute()

Est la valeur attendue.

c'est tout.

Recommended Posts

Comment se moquer d'un appel de super méthode dans PowerMock
Comment tester une méthode privée et la simuler partiellement en Java
Comment créer une méthode
Appelez la super méthode en Java
Comment insérer une vidéo dans Rails
Comment avoir des paramètres dans la méthode link_to
Comment stocker les informations saisies dans la zone de texte dans une variable de la méthode
Comment publier une bibliothèque dans jCenter
Comment référencer une colonne lors du remplacement de la méthode de nom de colonne dans ActiveRecord
Comment se moquer de chaque cas avec PowerMock + Mockito1x
Comment afficher une page Web en Java
Comment ajouter un chemin de classe dans Spring Boot
Comment créer un thème dans Liferay 7 / DXP
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
Comment générer automatiquement un constructeur dans Eclipse
Comment appeler AmazonSQSAsync
Comment faire une méthode de jugement pour rechercher n'importe quel caractère dans le tableau
Comment appeler des fonctions en bloc avec la réflexion Java
Comment créer un environnement Java en seulement 3 secondes
Je veux appeler une méthode d'une autre classe
Comment implémenter une fonctionnalité intéressante dans Ajax avec Rails
Comment créer un projet Spring Boot dans IntelliJ
Comment créer un URI de données (base64) en Java
Comment lancer une autre commande dans un programme Ruby
Comment afficher un aperçu du navigateur avec VS Code
[Comment insérer une vidéo dans un hameau avec Rails]
Comment écrire une recherche de comparaison de dates dans Rails
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment convertir un fichier en tableau d'octets en Java
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
[Rails] Comment charger JavaScript dans une vue spécifique
Comment écrire un mod de base dans Minecraft Forge 1.15.2
Comment laisser un commentaire
Comment insérer une vidéo
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comment utiliser la méthode getter / setter (en orientation objet)
Comment changer une chaîne dans un tableau en un nombre dans Ruby
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Je veux appeler une méthode et compter le nombre
Comment stocker des chaînes de ArrayList à String en Java (personnel)
Créer une méthode pour renvoyer le taux de taxe en Java
Comment appeler et utiliser l'API en Java (Spring Boot)
Comment sélectionner une date spécifiée par code dans le calendrier FS
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Comment ajouter les mêmes index dans un tableau imbriqué
Mappage à une classe avec un objet de valeur dans How to My Batis
Comment développer et enregistrer une application Sota en Java
Super facile en 2 étapes! Comment installer la devise! !! (version rails 5)
Comment simuler le téléchargement de formulaires post-objet vers OSS en Java
Comment créer un portlet de générateur de services dans Liferay 7 / DXP
Comment configurer un proxy avec authentification dans Feign
Comment utiliser la méthode link_to
Comment utiliser Lombok au printemps
Comment trouver May'n dans XPath
Comment utiliser la méthode include?