web-dev-qa-db-ja.com

SpringBoottestを持つ側面をテストする方法

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からの出力はありません。トリガされていないようです。

テストの側面をトリガーするには欠けているものがありますか?それとも、スプリングブーツのアスペクトをテストする他の方法はありますか?

6
Natan Cox

@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;
  }
}
 _

私はそれが仕事をすると思います。

2
Raphael Costa