[JAVA] ProxyFactory ist praktisch, wenn Sie AOP mit Spring testen möchten!

Überblick

Schreiben Sie zunächst einen normalen Testcode

Bereiten Sie die folgende Serviceklasse und den folgenden MethodInterceptor als Voraussetzung vor.

AOP-Zieldienst


@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"))
    }
}

Testcode


@SpringBootApplication
class SpringTestApplication

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

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

Ausführungsergebnis


intercept by configured interceptor
SampleService#execute

Schreiben Sie den Testcode mit ProxyFactory wie folgt

Testcode mit ProxyFactory


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

Ausführungsergebnis


intercept by Proxy
SampleService#execute

Kotlin kann eine Util-Funktion erstellen

Es ist auch gut, eine Util-Funktion mit Extension zu erstellen.

Beispiel mit der Kotlin-Erweiterung Testcode mit 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 bei Verwendung von @Aspect

Service und Konfiguration


@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")
    }
}

Testcode


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

Ausführungsergebnis


advice by proxy
SampleAspectService#execute

Recommended Posts

ProxyFactory ist praktisch, wenn Sie AOP mit Spring testen möchten!
Delicate ist praktisch, wenn Sie Teile wiederverwenden möchten
Wenn Sie InputStream in JDBI3 binden möchten
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
Wenn Sie irgendwo einen Fehler melden möchten, wenn Sie graphql-spring-boot mit Spring Boot verwenden
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
So führen Sie einen Komponententest für Spring AOP durch
Vorsichtsmaßnahmen bei der Verwendung von Spring AOP mit Jersery-Ressourcenklassen
Was tun, wenn Sie die Quellposition wissen möchten, an der die Methode in bind.pry definiert ist?
Ein Hinweis, wenn Sie Tupel in Java möchten
Wenn Sie die Methode außerhalb verwenden möchten
[Swift] Verwenden Sie nonzeroBitCount, wenn Sie in Swift popcnt möchten
[Ruby] Wenn Sie mehrere Zeichen ersetzen möchten
Wenn Sie die Testabdeckung privater Methoden in JUnit erfüllen möchten
Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen
Wenn Sie die Spring Boot + Thymeleaf-Verarbeitung trennen möchten
So testen Sie den Bildschirm zum Hochladen von Dateien mit Spring + Selenium
ORA-08177, wenn Spring Batch kontinuierlich in Oracle ausgeführt wird
Code, der verwendet werden soll, wenn Sie Json nur mit Standardbibliotheken in Java verarbeiten möchten
So schreiben Sie in die Modellklasse, wenn Sie mit PlayFramework Binärdaten in der Datenbank speichern möchten
Wenn Sie eine Java-Anwendung in ein Docker-Image verwandeln möchten, ist es praktisch, Jib zu verwenden.
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Wenn Sie Java-Bibliothekstests mit Spock in mehreren Modulen mit Gradle in Android Studio 3 implementieren möchten
Wenn Sie die Hauptzweiginformationen in dem aktuellen Zweig wiedergeben möchten, an dem Sie gerade arbeiten
Wenn im Docker-Protokoll keine Ausgabe für stdout vorhanden ist
Ich möchte beim Schreiben von Testcode zufällig Informationen generieren
Wenn Sie explizit ODER oder UND mit Ransack schreiben möchten
docker-compose.yml, wenn Sie MySQL auf Docker laufen lassen möchten
lombok.config, wenn Sie @Qualifier mit lombok an @RequiredArgsConstructor übergeben möchten
Einführung in Spring Boot ② ~ AOP ~
[Swift] Wenn Sie wissen möchten, ob die Anzahl der Zeichen in String mit einer bestimmten Anzahl übereinstimmt ...
So schreiben Sie, wenn Sie Zeilenumbrüche und Ausgaben beibehalten und XSS in Rails vermeiden möchten
Wie schreibe ich, wenn ich mit "C language string array" wie argv [] in Ruby-FFI umgehen möchte?
Wirf eine Ausnahme und fange, wenn es keinen Handler gibt, der dem Pfad im Frühjahr entspricht
Wenn Sie Ihre Container nur in der Cloud ausführen möchten, ist Azure Container Instances ganz einfach
Wenn ich versuche, Centos in VMware einzufügen, ist der Bereich tot
Wenn Sie die übergeordnete Klasse in Lomboks @builder aufnehmen möchten
So geben Sie den Wert aus, wenn sich ein Array im Array befindet
Einstellung, die in bind.pry konvertiert wird, wenn Sie pry in VScode eingeben
Wenn Sie devise eingeführt haben, aber weitere Spalten hinzufügen möchten
[Spring Boot] Bis @Autowired in der Testklasse [JUnit5] ausgeführt wird
Üben Sie die Verwendung, wenn Sie verschiedene Verarbeitungsgruppen seriell ausführen möchten
So lösen Sie das Problem, dass die Bean beim Verschachteln in Spring Batch nicht ordnungsgemäß verarbeitet wird
Das erste, was Sie tun müssen, wenn Sie mit Heroku auf GitHub mit Eclipse auf Java zufrieden sein möchten
Was tun, wenn der Vorgang nicht zulässig ist, wenn ein Befehl im Terminal ausgeführt wird?
Wie man Lombok im Frühling benutzt
Schreiben Sie den Testcode mit Spring Boot
Was ist @Autowired im Spring Boot?
Die Ereignisverarbeitung wird im Frühjahr durchgeführt.
Ein Memo, wenn Sie den Zeitteil des Kalenders löschen möchten
Spring.messages.fallback-to-system-locale: false ist erforderlich, um message.properties für die i18n-Unterstützung von Spring boot als Standard festzulegen
Wenn Rails eine Sitzung für einen bestimmten Controller deaktivieren soll
Zusammenfassung der Mittel, wenn Sie mit HTTP unter Android kommunizieren möchten