Spring Boot 2.1.6.releaseを使用してSpringに簡単な側面を作成しました。それは基本的にメソッドに費やされた合計時間を記録します。
@Aspect
@Component
public class TimeLoggerAspect {
private static final Logger log = LoggerFactory.getLogger(TimeLoggerAspect.class);
@Around("@annotation(demo.TimeLogger)")
public Object methodTimeLogger(ProceedingJoinPoint joinPoint)
throws Throwable {
long startTime = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long totalTime = System.currentTimeMillis() - startTime;
log.info("Method " + joinPoint.getSignature() + ": " + totalTime + "ms");
return proceed;
}
}
アスペクトはTimeLogger
注釈によってトリガーされます
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeLogger {
}
そしてこのような部品で使用されています
@Component
public class DemoComponent {
@TimeLogger
public void sayHello() {
System.out.println("hello");
}
}
Spring Boot Demoアプリケーションは、sayHello
インタフェースのrun
メソッドを介してCommandLineRunner
を呼び出します。
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Autowired
private DemoComponent demoComponent;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
demoComponent.sayHello();
}
}
完全性のために、私はbuild.gradle
:AOP、Spring Test、Jupiter(JUnit)のライブラリを追加します。
compile("org.springframework.boot:spring-boot-starter-aop")
testCompile("org.springframework.boot:spring-boot-starter-test")
testCompile("org.junit.jupiter:junit-jupiter-api")
testRuntime("org.junit.jupiter:junit-jupiter-engine")
アプリケーションを実行すると出力が出力されます(読み取り可能性のためにトリミング)
hello
... TimeLoggerAspect : Method void demo.DemoComponent.sayHello(): 4ms
ここまでは順調ですね。今、@SpringBootTest
注釈とjupiterに基づいてテストを作成します。
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {DemoComponent.class, TimeLoggerAspect.class})
public class DemoComponentFailTest {
@Autowired
private DemoComponent demoComponent;
@Test
public void shouldLogMethodTiming() {
demoComponent.sayHello();
}
}
そしてここで私は出力を得ます
hello
TimeLoggerAspect
からの出力はありません。トリガされていないようです。
テストの側面をトリガーするには欠けているものがありますか?それとも、スプリングブーツのアスペクトをテストする他の方法はありますか?
@AspectでBeanを宣言するファイル@Configurationを@EnableAspectJautoproxyを@EnableAspectJautoproxyに入れる必要があります。
@Aspect
@Configuration
@EnableAspectJAutoProxy
public class TimeLoggerAspect {
private static final Logger log = LoggerFactory.getLogger(TimeLoggerAspect.class);
@Around("@annotation(demo.TimeLogger)")
public Object methodTimeLogger(ProceedingJoinPoint joinPoint)
throws Throwable {
long startTime = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long totalTime = System.currentTimeMillis() - startTime;
log.info("Method " + joinPoint.getSignature() + ": " + totalTime + "ms");
return proceed;
}
}
_
私はそれが仕事をすると思います。