[JAVA] ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!

Aperçu

--Je veux tester si les paramètres AOP fonctionnent

Tout d'abord, écrivez un code de test normal

Préparez la classe Service et MethodInterceptor suivants comme prérequis.

Service cible AOP


@Service
class SampleService {
    fun execute() {
        println("SampleService#execute")
    }
}

Interceptor


class SampleInterceptor(
        private val name: String
) : MethodInterceptor {
    override fun invoke(invocation: MethodInvocation?): Any? {
        println("intercept by $name")
        return invocation?.proceed()
    }
}

class SampleServicePointCut : StaticMethodMatcherPointcut() {
    override fun matches(method: Method, @Nullable targetClass: Class<*>?): Boolean {
        return targetClass?.let { SampleService::class.java.isAssignableFrom(it) } ?: false
    }
}

config


@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
class AopConfig {

    @Bean
    fun interceptorA(): Advisor {
        return DefaultPointcutAdvisor(SampleServicePointCut(), SampleInterceptor("configured interceptor"))
    }
}

Code de test


@SpringBootApplication
class SpringTestApplication

@RunWith(SpringRunner::class)
@SpringBootTest(classes = [SpringTestApplication::class])
internal class SampleServiceTest {
    @Autowired
    private lateinit var service: SampleService

    @Test
    fun test() {
        service.execute()
    }
}

Résultat d'exécution


intercept by configured interceptor
SampleService#execute

Écrivez le code de test à l'aide de ProxyFactory comme suit

Code de test à l'aide de ProxyFactory


@Test
fun testByProxy() {
    val factory = ProxyFactory(SampleService())
    factory.addAdvisor(DefaultPointcutAdvisor(SampleServicePointCut(), SampleInterceptor("Proxy")))
    val proxy = factory.proxy as SampleService
    proxy.execute()
}

Résultat d'exécution


intercept by Proxy
SampleService#execute

Kotlin peut créer une fonction Util

Il est également bon de créer une fonction util en utilisant Extension.

Exemple d'utilisation du code de test d'extension kotlin à l'aide de ProxyFactory


@Test
fun testByProxy() {
    val proxy = SampleService().proxy {
        addAdvisor(DefaultPointcutAdvisor(SampleServicePointCut(), SampleInterceptor("Proxy")))
    }
    proxy.execute()
}

@Suppress("UNCHECKED_CAST")
fun <T : Any> T.proxy(settings: ProxyFactory.() -> Unit): T {
    return ProxyFactory(this).also { settings(it) }.proxy as T
}

AspectJProxyFactory si vous utilisez @Aspect

Service et configuration


@Aspect
@Component
class SampleAspect(
        private val name: String = ""
) {
    @Before("execution(* SampleAspectService.*(..))")
    fun advice() {
        println("advice by $name")
    }
}

@Service
class SampleAspectService {
    fun execute() {
        println("SampleAspectService#execute")
    }
}

Code de test


@Test
fun testAspectProxy() {
    val factory = AspectJProxyFactory(SampleAspectService())
    factory.addAspect(SampleAspect("proxy"))
    val proxy = factory.getProxy() as SampleAspectService
    proxy.execute()
}

Résultat d'exécution


advice by proxy
SampleAspectService#execute

Recommended Posts

ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!
Delicate est pratique à utiliser lorsque vous souhaitez réutiliser des pièces
Lorsque vous souhaitez lier InputStream dans JDBI3
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]
Lorsque vous souhaitez notifier une erreur quelque part lors de l'utilisation de graphql-spring-boot avec Spring Boot
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Comment faire un test unitaire de Spring AOP
Précautions lors de l'utilisation de Spring AOP avec les classes de ressources Jersery
Que faire lorsque vous souhaitez connaître la position source où la méthode est définie dans binding.pry
Une note quand vous voulez Tuple en Java
Lorsque vous souhaitez utiliser la méthode à l'extérieur
[Swift] Utilisez nonzeroBitCount lorsque vous voulez popcnt dans Swift
[Ruby] Lorsque vous souhaitez remplacer plusieurs caractères
Si vous souhaitez satisfaire la couverture de test des méthodes privées dans JUnit
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Si vous souhaitez séparer le traitement Spring Boot + Thymeleaf
Comment tester l'écran de téléchargement de fichiers avec Spring + Selenium
ORA-08177 lorsque Spring Batch est exécuté en continu dans Oracle
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
Comment écrire dans la classe Model lorsque vous souhaitez enregistrer des données binaires dans DB avec PlayFramework
Si vous souhaitez transformer une application Java en une image Docker, il est pratique d'utiliser jib.
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Lorsque vous souhaitez implémenter des tests de bibliothèque Java avec Spock en multi-module avec Gradle dans Android Studio 3
Lorsque vous souhaitez refléter les informations de la branche principale dans la branche actuelle sur laquelle vous travaillez actuellement
Lorsqu'il n'y a pas de sortie vers stdout dans le journal du docker
Je souhaite générer des informations de manière aléatoire lors de l'écriture du code de test
Lorsque vous souhaitez écrire explicitement OR ou AND avec ransack
docker-compose.yml lorsque vous voulez garder mysql en cours d'exécution avec docker
lombok.config lorsque vous voulez passer @Qualifier à @RequiredArgsConstructor avec lombok
Introduction à Spring Boot ② ~ AOP ~
[Swift] Lorsque vous voulez savoir si le nombre de caractères dans String correspond à un certain nombre ...
Comment écrire lorsque vous souhaitez conserver les sauts de ligne et la sortie tout en évitant XSS dans Rails
Comment écrire lorsque vous voulez gérer un "tableau de chaînes en langage C" comme argv [] dans Ruby-FFI
Lancer une exception et attraper lorsqu'il n'y a pas de gestionnaire correspondant au chemin au printemps
Si vous souhaitez simplement exécuter vos conteneurs dans le cloud, Azure Container Instances est facile
Quand j'essaye de mettre des centos dans VMware, le volet est mort
Si vous souhaitez inclure la classe parente dans @builder de Lombok
Comment afficher la valeur lorsqu'il y a un tableau dans le tableau
Paramètre qui se convertit en binding.pry lorsque vous tapez pry dans VScode
Lorsque vous avez introduit la devise mais que vous souhaitez ajouter plus de colonnes
[Spring Boot] Jusqu'à ce que @Autowired soit exécuté dans la classe de test [JUnit5]
Pratique à utiliser lorsque vous souhaitez exécuter différents groupes de traitement en série
Comment résoudre le problème que le bean n'est pas traité correctement lorsqu'il est imbriqué dans Spring Batch
La première chose à faire lorsque vous voulez être satisfait d'Heroku sur GitHub avec Eclipse sur Java
Que faire si l'opération non autorisée s'affiche lors de l'exécution d'une commande dans le terminal
Comment utiliser Lombok au printemps
Écrire du code de test avec Spring Boot
Le test de paramétrage JUnit 5 est super pratique
Qu'est-ce que @Autowired dans Spring Boot?
Le traitement des événements est effectué au printemps.
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
Spring.messages.fallback-to-system-locale: false est requis pour le message par défaut.properties pour la prise en charge i18n de Spring Boot
Lorsque vous souhaitez que Rails désactive une session pour un contrôleur spécifique
Résumé des moyens lorsque vous souhaitez communiquer avec HTTP sur Android