[JAVA] Comment faire un test unitaire de Spring AOP

Chose que tu veux faire

Je souhaite tester une classe avec un traitement intersectoriel créé par Spring AOP en une seule unité.

Comment Spring AOP fonctionne (en gros) et problèmes lors des tests unitaires

Spring AOP est établi en fonction de DI, et le côté qui utilise le composant injecte une instance de proxy (pas le bean enregistré dans le conteneur lui-même, mais le bean qui étend la fonction définie dans AOP). AOP est réalisé par. aop.png

Cependant, puisque ce que je veux faire cette fois-ci est un test unitaire, je voudrais fournir une méthode de test sans démarrer le conteneur DI et en fonction du contexte.

Échantillon préparé cette fois

S'il y a «null» dans l'argument, implémentez le processus de lancement de «NullPointerException» dans AOP et appliquez-le à la méthode de la classe «TestService» (classe de test). (L'annotation NullCheck n'est qu'un marqueur, je l'omettrai donc ici.)

AspectLogic.java



@Aspect
@Component
public class AspectLogic {
	@Around("@annotation(NullCheck)")
	public Object invoke(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
		System.out.println("NullCheck!!");
		Stream.of(proceedingJoinPoint.getArgs()).forEach(Objects::requireNonNull);//Obtenir tous les arguments et objets::Vérifier avec requireNonNull
		return proceedingJoinPoint.proceed();
    }
}

TestService.java



public class TestService {
	@NullCheck
	public void doSomething(Object arg) {
	}
}

Obtenez un proxy d'AspectJProxyFactory.

Implémentons la partie où Spring DI obtient le proxy du bean par nous-mêmes. Instance ʻAspectJProxyFactory Ajoutez la classe Aspect créée cette fois à. Si vous cliquez sur la méthode de l'échantillon de test en utilisant le proxy obtenu de l'usine, il semble que vous puissiez confirmer que le processus défini dans AOP est appelé et queNullPointerException` est levé.

TestAspectLogic.java


public class TestAspectLogic {
	@Test
	public void testAspect() {

		AspectJProxyFactory factory = new AspectJProxyFactory(new TestService());
		factory.addAspect(new AspectLogic()); //Appliquez la classe AspectLogic ici
		TestService proxy = factory.getProxy();

		try {
			proxy.doSomething(null);
			failBecauseExceptionWasNotThrown(NullPointerException.class);
		} catch(NullPointerException npe) {
		}

	}
}

production


NullCheck!!

Résumé

Écrivons fermement un test pour AOP.

Recommended Posts

Comment faire un test unitaire de Spring AOP
Comment écrire un test unitaire pour Spring Boot 2
Comment écrire un spécificateur de coupe de point Spring AOP
Introduction à Micronaut 2 ~ Test unitaire ~
Introduction à Spring Boot ② ~ AOP ~
Comment faire un test unitaire avec JVM sur une source à l'aide de RxAndroid
Comment tester l'écran de téléchargement de fichiers avec Spring + Selenium
Comment écrire dynamiquement des cas de test itératifs à l'aide de test / unit (Test :: Unit)
Comment utiliser Lombok au printemps
Remarques sur l'utilisation de Spring Data JDBC
[Comment installer Spring Data Jpa]
Comment configurer Spring Boot + PostgreSQL
Comment utiliser ModelMapper (Spring boot)
ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!
Exemple de code pour le test unitaire d'un contrôleur Spring Boot avec MockMvc
J'ai testé comment utiliser le test / l'unité de Ruby et le code de Janken.
Comment filtrer JUnit Test dans Gradle
Bibliothèque de tests unitaires Java Artery-Easy to use
Modifications majeures liées au test Spring Framework 5.0
Comment inclure Spring Tool dans Eclipse 4.6.3?
Je veux écrire un test unitaire!
Comment tester l'étendue privée avec JUnit
[Spring MVC] Comment transmettre des variables de chemin
Comment diviser un fichier de message Spring Boot
[SpringBoot] Comment écrire un test de contrôleur
À propos de Spring AOP
À propos de Spring AOP
[Java] Comment tester s'il est nul dans JUnit
À propos de la conception de Spring Boot et de l'environnement de test unitaire
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment tester les interruptions pendant Thread.sleep avec JUnit
Comprendre comment partager des connexions Spring DB (transactions DB)
Comment utiliser h2db intégré avec Spring Boot
Comment réduire l'image de Spring Boot Docker
JUnit 5: Comment écrire des cas de test dans enum
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
[Rails] Comment implémenter un test unitaire d'un modèle
Comment ajouter un chemin de classe dans Spring Boot
Comment écrire du code de test avec la certification de base
Comment se lier avec un fichier de propriétés dans Spring Boot
Comment définir plusieurs orm.xml dans Spring4, JPA2.1
[Spring Boot] Comment se référer au fichier de propriétés
Spring Boot - Comment définir le délai d'expiration de la session
Comment effectuer UT avec Excel en tant que données de test avec Spring Boot + JUnit5 + DBUnit
[Rails] De la préparation du test au test unitaire du modèle [RSpec]
Comment développer OpenSPIFe
Comment définir l'injection de dépendance Spring Boot (DI)
Comment appliquer HandlerInterceptor à la passerelle entrante http de Spring Integration
Comment appeler AmazonSQSAsync
Comment utiliser Map
Comment écrire des rails
Comment utiliser rbenv
Comment utiliser Struts2 * Spring Framework (plugin Spring) Version de juin 2017
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok