如何使用 SpringBootTest 测试某个方面?

2024-01-30

我使用 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 演示应用程序将调用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注释和木星。

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,因为它似乎没有被触发。

是否缺少某些东西来触发测试中的方面?或者还有其他方法来测试 Spring Boot 中的方面吗?


我有类似的问题。我的方面正在监听控制器方法。要激活它,请导入AnnotationAwareAspectJAutoProxyCreator成功了:

@RunWith(SpringRunner.class)
@Import(AnnotationAwareAspectJAutoProxyCreator.class) // activate aspect
@WebMvcTest(MyController.class)
public class MyControllerTest {

    ...

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 SpringBootTest 测试某个方面? 的相关文章

随机推荐

  • JavaScript 警报后页面重新加载/刷新 - 不希望这样做!

    我的 JavaScript 函数正在工作 但由于某种原因 在我的 IF 语句中显示警报后 页面重新加载 刷新 但我不希望它这样做 这是为什么 我怎样才能改变我的功能 使它不会这样做 我的功能 function valSubmit varNa
  • 为什么内联未命名命名空间?

    专家快速介绍 C 11 允许声明未命名的命名空间inline 这对我来说似乎是多余的 在未命名命名空间中声明的内容已经被使用 就像它们在封闭命名空间中声明一样 所以我的问题是 这是什么意思 inline namespace anonymou
  • 无需 APNS 从服务器到 iOS 设备的实时数据推送 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是否可以在操作中从 view.yml 获取值

    我想知道是否可以在操作中从 view yml 获取样式表的名称 最好使用像以下这样简单的东西 sfConfig get 我想访问 view yml 中的现有声明 而不是对其进行硬编码或将其复制到 app yml 之类的地方 Thanks 如
  • iOS8 中的扩展 - 由于没有系统应用程序而终止

    尝试运行我的 iOS 小部件 它是 Today 扩展 每次我尝试将其添加到通知中心时 我不断收到消息 由于没有系统应用程序而终止 有想法该怎么解决这个吗 我正在尝试制作一个包含表格视图的扩展 在您的项目设置中查找显示 启动屏幕文件 的设置
  • “mvn cleangenerate-sources”无法解决依赖关系

    there 我遇到了一个奇怪的问题 我有一个用 Maven 构建的多模块企业项目 我像这样设置项目层次结构 parentPom MyEar packaging ear MyUtilJar packaging jar MyEJB packin
  • 新安装时,curl 和 wget 对于 helloworld.php 返回错误 500,但浏览器正常

    我没有 htaccess 文件 我有index php 它包含以下内容 并且在 Chrome 或 Safari 等浏览器中运行良好 当我将其加载到浏览器中时 我得到 你好世界 当我尝试以下任何操作时 我收到错误 500 内部服务器错误 us
  • window.onresize 不在 Chrome 中触发,但在 Chrome Incognito 中触发

    我想问一下 在什么情况下可以这样呢 我有一个网站window onresize事件 适用于 Firefox IE9 Chrome 隐身窗口 但不适用于 Chrome 问题是 在我对代码进行一些不相关的更改之前 或者在我昨天更新 chrome
  • 在 Swift 中从类创建 JSON 对象

    我对 iOS 开发和 Swift 还很陌生 所以请耐心等待 我有一个类对象定义如下 class LocationPoint var x Double var y Double var orientation Double init x Do
  • 如何在 App store connect 中批准新版本

    如何在 App store connect 中批准新版本 我的意思是 我已经在苹果商店上提供了该移动应用程序的第一个版本 但现在我想发布一个新版本 我已经做的是通过 Xcode gt archive 上传它 然后在 appstoreconn
  • 如何在erlang中连接列表而不创建嵌套列表?

    我正在努力成为一名优秀的管理者并避免使用 我需要将一个元组添加到列表的末尾 而不创建嵌套列表 并且希望不必向后构建它并反转它 给定元组 T 和列表 L0 和 L1 当我使用 T L0 I get 元组 列表0 但是当我使用 L0 T 我得到
  • 如何从 Angular 应用程序范围之外更改 Angular 中的路由?

    我的问题标题可能有点令人困惑 所以希望以下详细信息能够澄清它 本质上 导航栏是我无法控制的 它是用简单的 HTML JS 编写的 我的应用程序是用 Angular 编写的 并在其中设置了路由 我可以做些什么来从导航栏触发 Angular 应
  • 复合类型的案例类伴生对象生成错误

    定义的空特征测试 trait Test 复合类型中使用什么 scala gt val a Int with Test 10 asInstanceOf Int with Test a Int with Test 10 以及带有复合类型参数的案
  • 如何在 Android 中访问 Web API 方法的返回值?

    在对如何做到这一点感到困惑之后 可以看出here https stackoverflow com questions 22797194 how to call a restful method from android and here h
  • 使用 asp.net ajax 时出现函数未定义错误

    我试图通过以下代码通过 asp net ajax 调用 Web 服务 namespace MCTS70515AJAX public static class HR public static int GetEmployeeCount str
  • 为 GitHub 设置 SSH 密钥

    我正在跟进这些说明 http help github com mac set up git 了解如何设置 SSH 密钥以用于 GitHub 说明会告诉您删除当前的 ssh目录并在该 ssh 目录中创建新密钥 我无法执行此操作 因为我的电脑中
  • AngularJS 中的子菜单(展开/折叠树)

    在过去的一天里 我一直在寻找使用 Angular 来控制带有子菜单的菜单列表的最佳方法 使用 jQuery 您可以在特定类型的元素 例如 li 并向其子元素添加一个类以打开菜单 我正在尝试做与此页面上的菜单相同的事情http geedmo
  • Postgres:将数据从一个数据库的公共模式移动到另一个数据库的新模式的最佳方式

    我是 Postgres 新手 刚刚发现我无法在一个 SQL 查询中访问不同数据库的数据 并且还学习了Postgres中模式的概念 现在 我有两个数据库 db1 和 db2 两者在其公共模式中都有相同名称的表 现在 我想在 db1 中创建一个
  • npgsql 和实体框架代码优先设置问题

    我最近收到的错误是 ERROR 42P01 relation dbo MigrationHistory does not exist 但我确信这只是因为之前的某些事情没有正确设置 我目前正在尝试首先设置实体框架 4 4 代码以使用 Npgs
  • 如何使用 SpringBootTest 测试某个方面?

    我使用 Spring Boot 2 1 6 RELEASE 在 Spring 中创建了一个简单的方面 它基本上记录了一个方法所花费的总时间 Aspect Component public class TimeLoggerAspect pri